diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index 1f2d96fe9e9b0d0db7d40e8ddc510131e8cee702..6587175f74129f9cce84aa7565c0f7f3610a7479 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -13,17 +13,6 @@
 
 # $Id$
 
-# Macros
-ifndef DEBUG
- ifndef RELEASE
-  DEBUG	:=	1
- endif
-endif
-
-ifndef VERBOSE
- QUIET	=	@
-endif
-
 #USE_DIALOG =   1       # Dialog vesrion of UIFC
 #USE_FLTK =     1       # Use Windowed version
 #USE_CURSES =	1	# Use *nix curses version
@@ -31,66 +20,13 @@ ifndef NO_CURSES
  USE_UIFC32      =       1       # Curses version of UIFC
 endif
 
-ifdef DEBUG
- BUILD	=	debug
-else
- BUILD	=	release
-endif
-BUILDPATH	:=	$(BUILD)
-
-ifeq ($(shell hostname),dmjunk.kingcole.local)
- THREADS_ACTUALLY_WORK=1
- BUILDPATH	:=	redhat
-endif
-
-ifdef bcc
- CC		=	bc++ -q
- CCPRE	:=	bcc
- CXX	=	bc++ -q
- LD		=	ilink -q
- CFLAGS +=	-mm -md -D__unix__ -w-csu -w-pch -w-ccc -w-rch -w-par -w-aus
-else
- CFLAGS	+=	-MMD -Wall
- CCPRE	?=	gcc
- ifdef BUILD_DEPENDS
-  CC	=	../build/mkdep -a
-  CXX	=	../build/mkdep -a
-  LD	=	echo
-  COMPILE_MSG	:= Depending
- else
-  CC	?=	gcc
-  CXX	?=	g++
-  LD	?=	ld
-  COMPILE_MSG	:= Compiling
- endif
-endif
-SLASH	=	/
-OFILE	=	o
-
 UIFC	=	../uifc/
 XPDEV	=	../xpdev/
-LIBPREFIX =	lib
 
-ifndef os
- os		:=	$(shell uname)
-endif
-ifeq ($(shell uname -m),ppc)
- os		:=	$(os)-ppc
-endif
-# this line wont work with solaris unless awk in path is actually gawk 
-os      :=	$(shell echo $(os) | tr "[ A-Z]" "[\-a-z]")
-# remove '/' from "os/2"
-os      :=  $(shell echo $(os) | tr -d "/")
+NEED_JAVASCRIPT	:= 1
+NEED_THREADS	:= 1
 
-ifeq ($(os),openbsd)
-LIBFILE =	.so.0.0
-else
- ifeq ($(os),darwin)
-  LIBFILE =	.dylib
- else
-  LIBFILE	=	.so
- endif
-endif
+include $(XPDEV)/Common.gmake
 
 ifeq ($(os),freebsd)
  BSD	=	1
@@ -100,70 +36,24 @@ else
  endif
 endif
 
-LIBODIR :=	$(CCPRE).$(os).lib.$(BUILDPATH)
-EXEODIR :=	$(CCPRE).$(os).exe.$(BUILDPATH)
-
-DELETE	=	rm -f
-
-CFLAGS  +=  -I$(XPDEV) -I$(UIFC) -DJAVASCRIPT -D_THREAD_SAFE -D_REENTRANT
-ifdef JSINCLUDE
- CFLAGS += -I$(JSINCLUDE)
-else
- CFLAGS += -I../../include/mozilla/js
-endif
-
-ifdef BSD	# BSD
- # Math libraries needed and uses pthread
- LFLAGS	:=	-lm -lutil
- CFLAGS +=	-pthread 
-else			# Linux / Other UNIX
- # Math and pthread libraries needed
- ifdef bcc
-  LFLAGS	:=	libpthread.so
- else
-  LFLAGS	:=	-lm -lpthread -lutil
- endif
-endif
+CFLAGS  +=  -I$(XPDEV)
 
-ifeq ($(os),linux)    # Linux
- ifndef THREADS_ACTUALLY_WORK
-  CFLAGS	+= -D_THREAD_SUID_BROKEN
- endif
+ifndef bcc
+ LDFLAGS	+=	-lm -lutil
 endif
 
 ifeq ($(os),sunos)    # Solaris
- CFLAGS	:= -D__solaris__ -DNEEDS_DAEMON -D_POSIX_PTHREAD_SEMANTICS -DNEEDS_FORKPTY
- LFLAGS := -lm -lpthread -lsocket -lnsl -lrt
+ LDFLAGS += -lsocket -lnsl -lrt
 endif
 
 ifeq ($(os),netbsd)
- CFLAGS += -D__unix__ -I/usr/pkg/include -DNEEDS_FORKPTY
- LFLAGS := -lm -lpthread -L/usr/pkg/lib -L/usr/pkg/pthreads/lib
- UTIL_LFLAGS	+=	-lpth -L/usr/pkg/lib
-endif
-
-ifeq ($(os),darwin)
- CFLAGS +=  -D__unix__ -fno-common -D__DARWIN__
- LFLAGS :=  -lm -lpthread
+ LDFLAGS += -L/usr/pkg/lib
+ UTIL_LDFLAGS	+=	-lpth -L/usr/pkg/lib
 endif
 
 # So far, only QNX has sem_timedwait()
 ifeq ($(os),qnx)
- LFLAGS := -lm -lsocket
-else
- CFLAGS	+=	-DUSE_XP_SEMAPHORES
- USE_XP_SEMAPHORES	:=	1
-endif
-
-ifdef DEBUG
- ifdef bcc
-  CFLAGS	+=	-y -v -Od
- else
-  CFLAGS	+=	-ggdb
- endif
- CFLAGS  +=	-D_DEBUG
-else
- CFLAGS	+= -O3
+ LDFLAGS += -lsocket
 endif
 
 ifdef PREFIX
@@ -174,68 +64,11 @@ ifdef USE_DOSEMU
  CFLAGS += -DUSE_DOSEMU
 endif
 
-ifndef JSLIBDIR
- JSLIBDIR := ../../lib/mozilla/js/$(os).$(BUILD)
-endif
-ifndef JSLIB
- JSLIB	:=	js
-endif
-ifndef NSPRDIR
- NSPRDIR := ../../lib/mozilla/nspr/$(os).$(BUILD)
-endif
-
 ifdef DONT_BLAME_SYNCHRONET
- LFLAGS += -DDONT_BLAME_SYNCHRONET
-endif
-
-LFLAGS += -L$(JSLIBDIR) -l$(JSLIB)
-
-# The following are needed for echocfg (uses UIFC)
-UIFC_OBJS =	$(LIBODIR)/uifcx.o
-ifdef USE_FLTK
- CFLAGS +=	-DUSE_FLTK -I../../include/fltk
- UIFC_LFLAGS += -L../../lib/fltk/$(os) -L/usr/X11R6/lib -lm -lfltk -lX11
- UIFC_OBJS+=	$(LIBODIR)/uifcfltk.o
-endif
-ifdef USE_CURSES
- CFLAGS +=	-DUSE_CURSES
- ifeq ($(os),qnx)
-  UIFC_LFLAGS += -lncurses
- else
-  ifeq ($(os),netbsd)
-   UIFC_LFLAGS += -lncurses
-  else
-   UIFC_LFLAGS += -lcurses
-  endif
- endif
- UIFC_OBJS +=	$(LIBODIR)/uifcc.o
+ LDFLAGS += -DDONT_BLAME_SYNCHRONET
 endif
 
-ifdef USE_UIFC32
- CFLAGS +=	-DUSE_UIFC32
- ifeq ($(os),qnx)
-  UIFC_LFLAGS += -lncurses
- else
-  ifeq ($(os),netbsd)
-   UIFC_LFLAGS += -lncurses
-  else
-   UIFC_LFLAGS += -lcurses
-  endif
- endif
- UIFC_OBJS +=	$(LIBODIR)/uifc32.o
- UIFC_OBJS +=	$(LIBODIR)/ciowrap.o
-endif
-
-#The following is needed for nspr support on Linux
-ifeq ($(os),linux)
- LFLAGS	+=	-ldl
-endif
-
-include targets.mk		# defines all targets
-include objects.mk		# defines $(OBJS)
-include sbbsdefs.mk		# defines $(SBBSDEFS)
-
-ifeq ($(USE_XP_SEMAPHORES),1)
+ifeq ($(XP_SEM),1)
  OBJS	+=	$(LIBODIR)$(SLASH)xpsem.$(OFILE)
 endif
 
@@ -244,53 +77,22 @@ SBBSLIB	=	-lsbbs
 
 #dummy rule
 $(SBBSLIB) : $(SBBS)
+	$(QUIET)touch -- '$(SBBSLIB)'
 
-vpath %.c $(XPDEV) $(UIFC)
-vpath %.cpp $(UIFC)
-
-LFLAGS		+=	-L./$(LIBODIR) -L$(NSPRDIR)
 ifneq ($(os),darwin)
-SBBSLDFLAGS	:=	$(LFLAGS) -rpath-link ./$(LIBODIR) -rpath ./ 
-#LFLAGS		+=	-Wl,-rpath-link,./$(LIBODIR),-rpath,./
-LFLAGS		+=	-Xlinker -rpath
-LFLAGS		+=	-Xlinker .
+SBBSLDFLAGS	:=	$(LDFLAGS) -rpath-link ./$(LIBODIR) -rpath ./ 
+#LDFLAGS		+=	-Wl,-rpath-link,./$(LIBODIR),-rpath,./
+LDFLAGS		+=	-Xlinker -rpath
+LDFLAGS		+=	-Xlinker .
 ifneq ($(os),openbsd)
-LFLAGS		+=	-Xlinker -rpath-link
-LFLAGS		+=	-Xlinker ./$(LIBODIR)
-LFLAGS		+=	-Xlinker -rpath-link
-LFLAGS		+=	-Xlinker $(JSLIBDIR)
-LFLAGS		+=	-Xlinker -rpath-link
-LFLAGS		+=	-Xlinker $(NSPRDIR)
-else
-LFLAGS		+=	-l$(JSLIB) -lnspr4
+LDFLAGS		+=	-Xlinker -rpath-link
+LDFLAGS		+=	-Xlinker ./$(LIBODIR)
+LDFLAGS		+=	-Xlinker -rpath-link
+LDFLAGS		+=	-Xlinker $(JSLIBDIR)
+LDFLAGS		+=	-Xlinker -rpath-link
+LDFLAGS		+=	-Xlinker $(NSPRDIR)
 endif
 endif
-ifeq ($(os),freebsd)
-LFLAGS		+=	-pthread
-endif
-ifeq ($(os),openbsd)
-LFLAGS		+=	-pthread
-endif
-
-# Implicit C Compile Rule for SBBS
-$(LIBODIR)/%.o : %.c $(BUILD_DEPENDS)
-   ifndef bcc
-	@echo $(COMPILE_MSG) $<
-   endif
-	$(QUIET)$(CC) $(CFLAGS) $(SBBSDEFS) -o $@ -c $<
-
-# Implicit C++ Compile Rule for SBBS
-$(LIBODIR)/%.o : %.cpp $(BUILD_DEPENDS)
-   ifndef bcc
-	@echo $(COMPILE_MSG) $<
-   endif
-	$(QUIET)$(CXX) $(CFLAGS) $(SBBSDEFS) -o $@ -c $<
-
-$(LIBODIR):
-	mkdir $(LIBODIR)
-
-$(EXEODIR):
-	mkdir $(EXEODIR)
 
 CON_OBJS	= $(LIBODIR)/sbbscon.o $(LIBODIR)/conwrap.o \
 		  $(LIBODIR)/sbbs_ini.o
@@ -323,49 +125,49 @@ FORCE$(SBBSMONO): $(MONO_OBJS) $(OBJS) $(LIBS)
 
 $(SBBSMONO): $(MONO_OBJS) $(OBJS) $(LIBS)
 	@echo Linking $@
-	$(QUIET)$(CXX) -o $@ $(LFLAGS) $^
+	$(QUIET)$(CXX) -o $@ $(LDFLAGS) $^
 
 # Synchronet BBS library Link Rule
 FORCE$(SBBS): $(OBJS) $(LIBS)
 
 $(SBBS): $(OBJS) $(LIBS)
 	@echo Linking $@
-	$(QUIET)$(MKSHPPLIB) $(LFLAGS) -o $@ $^ $(SHLIBOPTS)
+	$(QUIET)$(MKSHPPLIB) $(LDFLAGS) -o $@ $^ $(SHLIBOPTS)
 
 # FTP Server Link Rule
 FORCE$(FTPSRVR): $(LIBODIR)/ftpsrvr.o $(SBBSLIB)
 
 $(FTPSRVR): $(LIBODIR)/ftpsrvr.o $(SBBSLIB)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LFLAGS) $^ $(SHLIBOPTS) -o $@ 
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $^ $(SHLIBOPTS) -o $@ 
 
 # Mail Server Link Rule
 FORCE$(MAILSRVR): $(MAIL_OBJS) $(LIBODIR)$(SLASH)$(SBBSLIB)
 
 $(MAILSRVR): $(MAIL_OBJS) $(SBBSLIB)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LFLAGS) $^ $(SHLIBOPTS) -o $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $^ $(SHLIBOPTS) -o $@
 
 # Mail Server Link Rule
 FORCE$(WEBSRVR): $(WEB_OBJS) $(SBBSLIB)
 
 $(WEBSRVR): $(WEB_OBJS) $(SBBSLIB)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LFLAGS) $^ $(SHLIBOPTS) -o $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $^ $(SHLIBOPTS) -o $@
 
 # Services Link Rule
 FORCE$(SERVICES): $(WEB_OBJS) $(SBBSLIB)
 
 $(SERVICES): $(SERVICE_OBJS) $(SBBSLIB)
 	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LFLAGS) $^ $(SHLIBOPTS) -o $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $^ $(SHLIBOPTS) -o $@
 
 # Synchronet Console Build Rule
 FORCE$(SBBSCON): $(CON_OBJS) $(SBBSLIB) $(FTP_OBJS) $(MAIL_OBJS) $(WEB_OBJS) $(SERVICE_OBJS)
 
 $(SBBSCON): $(CON_OBJS) $(SBBSLIB) $(FTPSRVR) $(WEBSRVR) $(MAILSRVR) $(SERVICES)
 	@echo Linking $@
-	$(QUIET)$(CC) $(CFLAGS) $(LFLAGS) $(CON_LDFLAGS) -o $@ $(CON_OBJS) $(SBBSLIB)
+	$(QUIET)$(CC) $(CFLAGS) $(LDFLAGS) $(CON_LDFLAGS) -o $@ $(CON_OBJS) $(SBBSLIB)
 
 # Specifc Compile Rules
 $(LIBODIR)/ftpsrvr.o: ftpsrvr.c ftpsrvr.h $(BUILD_DEPENDS)
@@ -408,7 +210,7 @@ FORCE$(BAJA): $(BAJA_OBJS)
 
 $(BAJA): $(BAJA_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # Node Utility
 NODE_OBJS = \
@@ -419,7 +221,7 @@ FORCE$(NODE): $(NODE_OBJS)
 
 $(NODE): $(NODE_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^ 
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^ 
 
 # FIXSMB Utility
 FIXSMB_OBJS = \
@@ -432,7 +234,7 @@ FORCE$(FIXSMB): $(FIXSMB_OBJS)
 	
 $(FIXSMB): $(FIXSMB_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # CHKSMB Utility
 CHKSMB_OBJS = \
@@ -445,7 +247,7 @@ FORCE$(CHKSMB): $(CHKSMB_OBJS)
 
 $(CHKSMB): $(CHKSMB_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # SMB Utility
 SMBUTIL_OBJS = \
@@ -463,7 +265,7 @@ FORCE$(SMBUTIL): $(SMBUTIL_OBJS)
 	
 $(SMBUTIL): $(SMBUTIL_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # SBBSecho (FidoNet Packet Tosser)
 SBBSECHO_OBJS = \
@@ -490,7 +292,7 @@ FORCE$(SBBSECHO): $(SBBSECHO_OBJS)
 
 $(SBBSECHO): $(SBBSECHO_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # SBBSecho Configuration Program
 ECHOCFG_OBJS = \
@@ -508,7 +310,7 @@ FORCE$(ECHOCFG): $(ECHOCFG_OBJS)
 
 $(ECHOCFG): $(ECHOCFG_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^ $(UIFC_LFLAGS)
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^ $(UIFC_LDFLAGS)
 
 # ADDFILES
 ADDFILES_OBJS = \
@@ -531,7 +333,7 @@ FORCE$(ADDFILES): $(ADDFILES_OBJS)
 
 $(ADDFILES): $(ADDFILES_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # FILELIST
 FILELIST_OBJS = \
@@ -553,7 +355,7 @@ FORCE$(FILELIST): $(FILELIST_OBJS)
 
 $(FILELIST): $(FILELIST_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # MAKEUSER
 MAKEUSER_OBJS = \
@@ -575,7 +377,7 @@ FORCE$(MAKEUSER): $(MAKEUSER_OBJS)
 
 $(MAKEUSER): $(MAKEUSER_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # JSEXEC
 JSEXEC_OBJS = \
@@ -586,30 +388,20 @@ FORCE$(JSEXEC): $(JSEXEC_OBJS)
 
 $(JSEXEC): $(JSEXEC_OBJS)
 	@echo Linking $@
-	$(QUIET)$(CXX) $(UTIL_LFLAGS) -o $@ $^ $(LFLAGS)
+	$(QUIET)$(CXX) $(UTIL_LDFLAGS) -o $@ $^ $(LDFLAGS)
 	
 # ANS2ASC
 FORCE$(ANS2ASC): $(LIBODIR)/ans2asc.o
 
 $(ANS2ASC): $(LIBODIR)/ans2asc.o
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 # ASC2ANS
 FORCE$(ASC2ANS): $(LIBODIR)/asc2ans.o
 
 $(ASC2ANS): $(LIBODIR)/asc2ans.o
 	@echo Linking $@
-	$(QUIET)$(CC) $(UTIL_LFLAGS) -o $@ $^
-
-depend:
-	$(QUIET)$(DELETE) $(LIBODIR)/.depend
-	$(QUIET)$(DELETE) $(EXEODIR)/.depend
-	$(MAKE) BUILD_DEPENDS=FORCE
+	$(QUIET)$(CC) $(UTIL_LDFLAGS) -o $@ $^
 
 FORCE:
-
--include $(LIBODIR)/.depend
--include $(EXEODIR)/.depend
--include $(LIBODIR)/*.d
--include $(EXEODIR)/*.d
diff --git a/src/sbbs3/install/GNUmakefile b/src/sbbs3/install/GNUmakefile
index 39f48b70c0ec1eff7ba2ec079a1dd7d348ded535..9a038d7a6a8bac4f90fb0825c9ab17bf199777e3 100644
--- a/src/sbbs3/install/GNUmakefile
+++ b/src/sbbs3/install/GNUmakefile
@@ -14,91 +14,25 @@
 # $Id$
 
 #USE_DIALOG =	1	# Dialog vesrion of UIFC
-USE_CURSES	=	1	# Curses version of UIFC
+#USE_CURSES	=	1	# Curses version of UIFC
 #USE_FLTK	=	1	# Windowed version of UIFC
-CC		=	gcc
-SLASH	=	/
-OFILE	=	o
-UIFC	=	../../uifc
-XPDEV	=	../../xpdev
+USE_UIFC32	:=	1	# New 32-bit version of UIFC
+UIFC	=	../../uifc/
+XPDEV	=	../../xpdev/
+
+NEED_UIFC	:=	1
+include $(XPDEV)/Common.gmake
 
 ifdef STATIC
  LDFLAGS	+=	-static
 endif
 
-ifndef os
- os		=	$(shell uname)
-endif
-os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
-# remove '/' from "os/2"
-os      :=  $(shell echo $(os) | tr -d "/")
-
-ifeq ($(os),netbsd)
- CFLAGS	+=	-D__unix__ -I/usr/pkg/include -DUSE_XP_SEMAPHORES
- LDFLAGS +=	-L/usr/pkg/lib
-endif
-
-ODIR	:=	gcc.$(os)
-
-LIBDIR	:=	/usr/lib
-DELETE	=	rm -f -v
-OUTLIB	=	-o
-
-#CFLAGS	+=	-g
-CFLAGS	+=	-O2
-CFLAGS	+=	-MMD -Wall -I$(UIFC) -I$(XPDEV) -I..
-
-LDFLAGS	+=	-L/usr/local/lib
-
-ODIR	:=	$(ODIR).release
-
-include targets.mk		# defines all targets
-include objects.mk		# defines $(OBJS)
-
-ifdef USE_DIALOG		
- LDFLAGS	+=	-L../../libdialog -ldialog -lncurses
- CFLAGS	+=	-I../../libdialog -DUSE_DIALOG
- OBJS += $(ODIR)$(SLASH)uifcd.$(OFILE)
-endif
-
-ifdef USE_CURSES
- LDFLAGS	+=	-lncurses
- CFLAGS	+=	-DUSE_CURSES
- OBJS += $(ODIR)$(SLASH)uifc32.$(OFILE)
-endif
-
-ifdef USE_FLTK
- LDFLAGS +=	-L/usr/X11R6/lib -lfltk -lX11 -lm
- CFLAGS +=	-I/usr/local/include -I/usr/X11R6/include -DUSE_FLTK
- OBJS += $(ODIR)$(SLASH)uifcfltk.$(OFILE)
-endif
-
-vpath %.c ..
-vpath %.c $(UIFC)
-vpath %.c $(XPDEV)
-
-# Implicit C Compile Rule for SBBSINST
-$(ODIR)/%.o : %.c
-	@echo Compiling $<
-	@$(CC) $(CFLAGS) -c $(SBBSDEFS) $< -o $@
-
-# Explicit C++ Compile Rule for SBBSINST
-$(ODIR)/uifcfltk.o : $(UIFC)/uifcfltk.cpp
-	@echo Compiling uifcfltk.cpp
-	$(CC) $(CFLAGS) -c $(SBBSDEFS) $(UIFC)/uifcfltk.cpp -o $(ODIR)/uifcfltk.o
-
-# Create output directories
-$(ODIR):
-	mkdir $(ODIR)
-
-# Monolithic Synchronet executable Build Rule
 $(SBBSINST): $(OBJS)
    ifdef USE_DIALOG
-	@$(MAKE) --no-print-directory -C ../../libdialog
+	$(QUIET)$(MAKE) --no-print-directory -C ../../libdialog
    endif
-	@echo Linking $@
-	@$(CC) -o $@ $(OBJS) $(LDFLAGS)
-#	@strip $@
+	$(QUIET)echo Linking $@
+	$(QUIET)$(CC) -o $@ $(OBJS) $(LDFLAGS)
 
 # Auto-dependency files (should go in output dir, but gcc v2.9.5 puts in cwd)
 -include ./*.d
diff --git a/src/sbbs3/install/objects.mk b/src/sbbs3/install/objects.mk
index fa58cce9aeeba474d94af7f1abded64ac38ba4c8..2fe65f1377fd8ac5ca2851ab9674f87953cb362b 100644
--- a/src/sbbs3/install/objects.mk
+++ b/src/sbbs3/install/objects.mk
@@ -7,11 +7,9 @@
 # LIBODIR, SBBSLIBODIR, SLASH, and OFILE must be pre-defined
 
 
-OBJS	=	$(ODIR)$(SLASH)sbbsinst.$(OFILE)\
-			$(ODIR)$(SLASH)sockwrap.$(OFILE)\
-			$(ODIR)$(SLASH)genwrap.$(OFILE)\
-			$(ODIR)$(SLASH)dirwrap.$(OFILE)\
-			$(ODIR)$(SLASH)filewrap.$(OFILE)\
-			$(ODIR)$(SLASH)ciowrap.$(OFILE)\
-			$(ODIR)$(SLASH)httpio.$(OFILE)\
-			$(ODIR)$(SLASH)uifcx.$(OFILE)
+OBJS	=	$(LIBODIR)$(SLASH)sbbsinst.$(OFILE)\
+			$(LIBODIR)$(SLASH)sockwrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)genwrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)dirwrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)filewrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)httpio.$(OFILE)
diff --git a/src/sbbs3/install/targets.mk b/src/sbbs3/install/targets.mk
index 2864b080570a66212034e92388f123c1a718997d..6448089e439b877e4461af3447f15a9ef1a0165c 100644
--- a/src/sbbs3/install/targets.mk
+++ b/src/sbbs3/install/targets.mk
@@ -6,10 +6,8 @@
 
 # ODIR, SLASH, LIBFILE, EXEFILE, and DELETE must be pre-defined
 
-SBBSINST	=	$(ODIR)$(SLASH)sbbsinst$(EXEFILE) 
+SBBSINST	=	$(EXEODIR)$(SLASH)sbbsinst$(EXEFILE) 
 
-all:	$(ODIR) \
+all:	$(EXEODIR) \
+		$(LIBODIR) \
 		$(SBBSINST)
-
-clean:
-	@$(DELETE) $(ODIR)$(SLASH)*
diff --git a/src/sbbs3/scfg/GNUmakefile b/src/sbbs3/scfg/GNUmakefile
index f95a3276ccecdd61fd50b6d5c6f6d318fe41b648..df0f21b4ad35bc3be69d2ff5b2c8cba615914f9b 100644
--- a/src/sbbs3/scfg/GNUmakefile
+++ b/src/sbbs3/scfg/GNUmakefile
@@ -13,147 +13,29 @@
 
 # $Id$
 
-# Macros
-ifndef DEBUG
- ifndef RELEASE
-  DEBUG	:=	1
- endif
-endif
-
 #USE_DIALOG =	1	# Dialog vesrion of UIFC
 #USE_FLTK =	1	# Use Windowed version
 ifndef NO_CURSES
  #USE_CURSES	=	1	# Curses version of UIFC
  USE_UIFC32	=	1	# NEW curses version of uifc
 endif
-CC		=	gcc
-CCPP		=	g++
-SLASH	=	/
-OFILE	=	o
-UIFC	=	../../uifc
-XPDEV	=	../../xpdev
-
-ifndef os
- os		=	$(shell uname)
-endif
-os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
-# remove '/' from "os/2"
-os      :=  $(shell echo $(os) | tr -d "/")
-
-ODIR	:=	gcc.$(os)
-
-LIBDIR	:=	/usr/lib
-DELETE	=	rm -f
-OUTLIB	=	-o
-
-CFLAGS	+=	-MMD
-CFLAGS	+=	-Wall -I$(UIFC) -I$(XPDEV) -I../
-
-LFLAGS	:=	-L/usr/local/lib
-
-ifeq ($(os),qnx)
-CURSESLIB :=	-lncurses
-else
-CURSESLIB :=	-lcurses
-endif
-
-ifdef USE_DIALOG
- LFLAGS	+=	-L../../libdialog -ldialog $(CURSESLIB)
- CFLAGS	+=	-I../../libdialog -DUSE_DIALOG
-endif
-
-ifdef USE_CURSES
- LFLAGS	+=	$(CURSESLIB)
- CFLAGS	+=	-DUSE_CURSES
-endif
-
-ifdef USE_UIFC32
- LFLAGS	+=	$(CURSESLIB)
- CFLAGS	+=	-DUSE_UIFC32
-endif
-
-ifdef USE_FLTK
- LFLAGS +=	-L../../../lib/fltk/$(os) -L/usr/X11R6/lib -lfltk -lX11
- CFLAGS +=	-I../../../include/fltk -I/usr/X11R6/include -DUSE_FLTK
-endif
-
-ifdef DEBUG
- CFLAGS	+=	-ggdb -O0 -D_DEBUG 
- ODIR	:=	$(ODIR).debug
-else # RELEASE
- ODIR	:=	$(ODIR).release
-endif
 
-include targets.mk		# defines all targets
-include objects.mk		# defines $(OBJS)
-
-ifeq ($(os),netbsd)
- CFLAGS	+=	-D__unix__ -I/usr/pkg/include
-endif
-
-ifeq ($(os),darwin)
- CFLAGS +=  -D__unix__ -D__DARWIN__
-endif
-
-ifdef USE_DIALOG		
- OBJS += $(ODIR)$(SLASH)uifcd.$(OFILE)
-endif
-
-ifdef USE_CURSES		
- OBJS += $(ODIR)$(SLASH)uifcc.$(OFILE)
-endif
-
-ifdef USE_UIFC32
- OBJS += $(ODIR)$(SLASH)uifc32.$(OFILE)
- OBJS += $(ODIR)$(SLASH)ciowrap.$(OFILE)
-endif
-
-ifdef USE_FLTK
- OBJS += $(ODIR)$(SLASH)uifcfltk.$(OFILE)
-endif
-
-# So far, only QNX has sem_timedwait() 
-ifeq ($(os),qnx)
- LFLAGS := -lm -lsocket
-else
- CFLAGS +=      -DUSE_XP_SEMAPHORES
- USE_XP_SEMAPHORES      :=      1
-endif
-
-
-vpath %.c ..
-vpath %.c $(UIFC)
-vpath %.cpp $(UIFC)
-vpath %.c $(XPDEV)
-
-# Implicit C Compile Rule for SCFG
-$(ODIR)/%.o : %.c
-	@echo Compiling $<
-	@$(CC) $(CFLAGS) -c $(SBBSDEFS) $< -o $@
-
-# Implicit C++ Compile Rule for SCFG
-$(ODIR)/%.o : %.cpp
-	@echo Compiling $<
-	@$(CC) $(CFLAGS) -c $(SBBSDEFS) $< -o $@
-
-# Create output directories
-$(ODIR):
-	mkdir $(ODIR)
+UIFC	=	../../uifc/
+XPDEV	=	../../xpdev/
+NEED_UIFC	:=	1
+include $(XPDEV)Common.gmake
+SCFG	:=	$(EXEODIR)$(SLASH)scfg$(EXEFILE)
 
 $(MAKEHELP): makehelp.c
-	@$(CC) $(CFLAGS) makehelp.c -o $(MAKEHELP)
+	$(QUIET)$(CC) $(CFLAGS) makehelp.c -o $(MAKEHELP)
 
 $(SCFGHELP): $(OBJS) $(MAKEHELP)
-	@$(MAKEHELP) $(ODIR)
+	$(QUIET)$(MAKEHELP) $(EXEODIR)
 
 # Monolithic Synchronet executable Build Rule
 $(SCFG): $(OBJS)
    ifdef USE_DIALOG
-	@$(MAKE) --no-print-directory -C ../../libdialog
+	$(QUIET)$(MAKE) --no-print-directory -C ../../libdialog
    endif
 	@echo Linking $@
-	@$(CCPP) -o $@ $(OBJS) $(LFLAGS)
-
-# Auto-dependency files (should go in output dir, but gcc v2.9.5 puts in cwd)
--include ./*.d
--include $(ODIR)/*.d
+	$(QUIET)$(CXX) -o $@ $(OBJS) $(LDFLAGS)
diff --git a/src/sbbs3/scfg/objects.mk b/src/sbbs3/scfg/objects.mk
index 155f8fb604b26606491073351a9427a08398ef17..d633366ace6246eadc6674f64b497374785e2a01 100644
--- a/src/sbbs3/scfg/objects.mk
+++ b/src/sbbs3/scfg/objects.mk
@@ -7,31 +7,29 @@
 # LIBODIR, SBBSLIBODIR, SLASH, and OFILE must be pre-defined
 
 
-OBJS	=	$(ODIR)$(SLASH)scfg.$(OFILE)\
-			$(ODIR)$(SLASH)scfgxtrn.$(OFILE)\
-			$(ODIR)$(SLASH)scfgmsg.$(OFILE)\
-			$(ODIR)$(SLASH)scfgnet.$(OFILE)\
-			$(ODIR)$(SLASH)scfgnode.$(OFILE)\
-			$(ODIR)$(SLASH)scfgsub.$(OFILE)\
-			$(ODIR)$(SLASH)scfgsys.$(OFILE)\
-			$(ODIR)$(SLASH)scfgxfr1.$(OFILE)\
-			$(ODIR)$(SLASH)scfgxfr2.$(OFILE)\
-			$(ODIR)$(SLASH)scfgchat.$(OFILE)\
-            $(ODIR)$(SLASH)scfgsave.$(OFILE)\
-            $(ODIR)$(SLASH)scfglib1.$(OFILE)\
-            $(ODIR)$(SLASH)smblib.$(OFILE)\
-            $(ODIR)$(SLASH)scfglib2.$(OFILE)\
-            $(ODIR)$(SLASH)ars.$(OFILE)\
-            $(ODIR)$(SLASH)load_cfg.$(OFILE)\
-            $(ODIR)$(SLASH)nopen.$(OFILE)\
-            $(ODIR)$(SLASH)crc16.$(OFILE)\
-            $(ODIR)$(SLASH)crc32.$(OFILE)\
-            $(ODIR)$(SLASH)dat_rec.$(OFILE)\
-            $(ODIR)$(SLASH)userdat.$(OFILE)\
-            $(ODIR)$(SLASH)date_str.$(OFILE)\
-			$(ODIR)$(SLASH)str_util.$(OFILE)\
-			$(ODIR)$(SLASH)genwrap.$(OFILE)\
-			$(ODIR)$(SLASH)dirwrap.$(OFILE)\
-			$(ODIR)$(SLASH)filewrap.$(OFILE)\
-			$(ODIR)$(SLASH)uifcx.$(OFILE)
-
+OBJS	=	$(LIBODIR)$(SLASH)scfg.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgxtrn.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgmsg.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgnet.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgnode.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgsub.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgsys.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgxfr1.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgxfr2.$(OFILE)\
+			$(LIBODIR)$(SLASH)scfgchat.$(OFILE)\
+            $(LIBODIR)$(SLASH)scfgsave.$(OFILE)\
+            $(LIBODIR)$(SLASH)scfglib1.$(OFILE)\
+            $(LIBODIR)$(SLASH)smblib.$(OFILE)\
+            $(LIBODIR)$(SLASH)scfglib2.$(OFILE)\
+            $(LIBODIR)$(SLASH)ars.$(OFILE)\
+            $(LIBODIR)$(SLASH)load_cfg.$(OFILE)\
+            $(LIBODIR)$(SLASH)nopen.$(OFILE)\
+            $(LIBODIR)$(SLASH)crc16.$(OFILE)\
+            $(LIBODIR)$(SLASH)crc32.$(OFILE)\
+            $(LIBODIR)$(SLASH)dat_rec.$(OFILE)\
+            $(LIBODIR)$(SLASH)userdat.$(OFILE)\
+            $(LIBODIR)$(SLASH)date_str.$(OFILE)\
+			$(LIBODIR)$(SLASH)str_util.$(OFILE)\
+			$(LIBODIR)$(SLASH)genwrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)dirwrap.$(OFILE)\
+			$(LIBODIR)$(SLASH)filewrap.$(OFILE)
diff --git a/src/sbbs3/scfg/targets.mk b/src/sbbs3/scfg/targets.mk
index 4a39a948edc8290e2d56f8b1b09b7e22f17091f3..d3ef10013c976e6e4a6669aee18bd60f65e0fef0 100644
--- a/src/sbbs3/scfg/targets.mk
+++ b/src/sbbs3/scfg/targets.mk
@@ -4,14 +4,12 @@
 
 # $Id$
 
-# ODIR, SLASH, LIBFILE, EXEFILE, and DELETE must be pre-defined
+# LIBODIR, SLASH, LIBFILE, EXEFILE, and DELETE must be pre-defined
 
-SCFG	=	$(ODIR)$(SLASH)scfg$(EXEFILE) 
-MAKEHELP=	$(ODIR)$(SLASH)makehelp$(EXEFILE) 
-SCFGHELP=	$(ODIR)$(SLASH)scfghelp.dat
+SCFG	=	$(EXEODIR)$(SLASH)scfg$(EXEFILE) 
+MAKEHELP=	$(EXEODIR)$(SLASH)makehelp$(EXEFILE) 
+SCFGHELP=	$(EXEODIR)$(SLASH)scfghelp.dat
 
-all:	$(ODIR) \
+all:	$(EXEODIR) \
+		$(LIBODIR) \
 		$(SCFG) $(SCFGHELP)
-
-clean:
-	@$(DELETE) $(ODIR)$(SLASH)*
diff --git a/src/sbbs3/targets.mk b/src/sbbs3/targets.mk
index ce65011d8a69a6f704664b80eb29bd441379b769..083ea8f3b3e4cae05171a6d2ff4cb9a7cb310ce7 100644
--- a/src/sbbs3/targets.mk
+++ b/src/sbbs3/targets.mk
@@ -42,7 +42,3 @@ dlls:	$(LIBODIR) \
 		$(SBBS) $(FTPSRVR) $(MAILSRVR) $(SERVICES)
 
 mono:	$(LIBODIR) $(EXEODIR) $(SBBSMONO)
-
-clean:
-	@$(DELETE) $(LIBODIR)$(SLASH)*
-	@$(DELETE) $(EXEODIR)$(SLASH)*
diff --git a/src/sbbs3/uedit/GNUmakefile b/src/sbbs3/uedit/GNUmakefile
index 34cf9057e09f96616c50ed9314cd3f0ff6e3dcd7..44505ac0cd6b4c2827bc6cf82a74d95ddba21138 100644
--- a/src/sbbs3/uedit/GNUmakefile
+++ b/src/sbbs3/uedit/GNUmakefile
@@ -16,143 +16,13 @@
 #USE_CURSES	:=	1	#Use old curses UIFC implementation
 USE_UIFC32	:=	1	# Use new uifc32 implementation
 
-# Macros
-ifndef RELEASE
- ifndef DEBUG
-  RELEASE	:=	1
- endif
-endif
-
-ifdef DEBUG
- BUILD	=	debug
- CFLAGS	+=	-g
-else
- BUILD	=	release
-endif
-
-ifdef bcc
- CC		=	bc++ -q
- CCPRE	:=	bcc
- CXX	=	bc++ -q
- LD		=	ilink -q
- CFLAGS +=	-mm -md -D__unix__ -w-csu -w-pch -w-ccc -w-rch -w-par -w-aus
-else
- CFLAGS	+=	-MMD -Wall
- CCPRE	?=	gcc
- ifdef BUILD_DEPENDS
-  CC	=	../../build/mkdep -a
-  CXX	=	../../build/mkdep -a
-  LD	=	echo
-  COMPILE_MSG	:= Depending
- else
-  CC	?=	gcc
-  CXX	?=	g++
-  LD	?=	ld
-  COMPILE_MSG	:= Compiling
- endif
-endif
-OFILE	=	o
-
-LIBFILE	=	.a
-UIFC	=	../../uifc/
 XPDEV	=	../../xpdev/
 SBBS3	=   ../
-
-ifndef os
- os		:=	$(shell uname)
-endif
-# this line wont work with solaris unless awk in path is actually gawk 
-os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
-#os      :=	$(shell echo $(os) | awk '/.*/ { print tolower($$1)}')
-# remove '/' from "os/2"
-os      :=  $(shell echo $(os) | tr -d "/")
-
-LIBODIR :=	$(CCPRE).$(os).lib.$(BUILD)
-EXEODIR :=	$(CCPRE).$(os).exe.$(BUILD)
-
-DELETE	=	rm -f
-
-CFLAGS	+=	-I../../include/mozilla/js -I$(XPDEV) -I$(UIFC) -I$(SBBS3)
-LFLAGS	+=	-lcurses
-
-ifeq ($(os),netbsd)
- CFLAGS	+=	-D__unix__ -I/usr/pkg/include
-endif
-
-# So far, only QNX has sem_timedwait() 
-ifeq ($(os),qnx)
- LFLAGS := -lm -lsocket
-else
- CFLAGS +=      -DUSE_XP_SEMAPHORES
- USE_XP_SEMAPHORES      :=      1
-endif
-
-vpath %.c $(UIFC) $(XPDEV) $(SBBS3)
-vpath %.cpp $(SBBS3)
-
-OBJS	:=	$(LIBODIR)/filewrap.o \
-			$(LIBODIR)/sockwrap.o \
-			$(LIBODIR)/dirwrap.o \
-			$(LIBODIR)/genwrap.o \
-			$(LIBODIR)/sbbs_ini.o \
-			$(LIBODIR)/ini_file.o \
-			$(LIBODIR)/scfglib1.o \
-			$(LIBODIR)/scfglib2.o \
-			$(LIBODIR)/nopen.o \
-			$(LIBODIR)/userdat.o \
-			$(LIBODIR)/ars.o \
-			$(LIBODIR)/dat_rec.o \
-			$(LIBODIR)/str_util.o \
-			$(LIBODIR)/crc16.o \
-			$(LIBODIR)/load_cfg.o \
-			$(LIBODIR)/date_str.o \
-			$(LIBODIR)/smblib.o \
-			$(LIBODIR)/getstats.o \
-			$(LIBODIR)/getmail.o \
-			$(LIBODIR)/uedit.o
-
-ifdef USE_CURSES
- OBJS	+=	$(LIBODIR)/uifcc.o
-endif
-
-ifdef USE_UIFC32
- OBJS	+=	$(LIBODIR)/uifc32.o \
-		$(LIBODIR)/ciowrap.o
-endif
-
-all: $(LIBODIR) $(BUILD_DEPENDS)$(EXEODIR)/uedit
+NEED_UIFC	:=	1
+include $(XPDEV)Common.gmake
 
 FORCE$(EXEODIR)/uedit: $(EXEODIR) $(OBJS) $(BUILD_DEPENDS)
 
 $(EXEODIR)/uedit: $(EXEODIR) $(OBJS) $(BUILD_DEPENDS)
 	@echo Linking $@
-	@$(CC) $(LFLAGS) $(OBJS) -o $@
-
-# Implicit C Compile Rule for utils
-$(LIBODIR)/%.o : %.c $(LIBODIR) $(BUILD_DEPENDS)
-   ifndef bcc
-	@echo $(COMPILE_MSG) $<
-   endif
-	@$(CC) $(CFLAGS) -o $@ -c $<
-
-$(LIBODIR):
-	mkdir $(LIBODIR)
-
-$(EXEODIR):
-	mkdir $(EXEODIR)
-
-clean:
-	@$(DELETE) $(LIBODIR)/*
-	@$(DELETE) $(EXEODIR)/*
-
-depend:
-	@$(DELETE) $(LIBODIR)/.depend
-	@$(DELETE) $(EXEODIR)/.depend
-	$(MAKE) BUILD_DEPENDS=FORCE
-
-FORCE:
-
--include $(LIBODIR)/.depend
--include $(EXEODIR)/.depend
--include $(LIBODIR)/*.d
--include $(EXEODIR)/*.d
+	@$(CC) $(LDFLAGS) $(OBJS) -o $@
diff --git a/src/sbbs3/umonitor/GNUmakefile b/src/sbbs3/umonitor/GNUmakefile
index 84d0cd2717083dbecf92cd673c3ecd7ce86ea176..c18f26ce885b39a0cb6f8e221f5050811c49f0d1 100644
--- a/src/sbbs3/umonitor/GNUmakefile
+++ b/src/sbbs3/umonitor/GNUmakefile
@@ -16,143 +16,18 @@
 #USE_CURSES	:=	1	#Use old curses UIFC implementation
 USE_UIFC32	:=	1	# Use new uifc32 implementation
 
-# Macros
-ifndef RELEASE
- ifndef DEBUG
-  RELEASE	:=	1
- endif
-endif
-
-ifdef DEBUG
- BUILD	=	debug
- CFLAGS	+=	-g
-else
- BUILD	=	release
-endif
-
-ifdef bcc
- CC		=	bc++ -q
- CCPRE	:=	bcc
- CXX	=	bc++ -q
- LD		=	ilink -q
- CFLAGS +=	-mm -md -D__unix__ -w-csu -w-pch -w-ccc -w-rch -w-par -w-aus
-else
- CFLAGS	+=	-MMD -Wall
- CCPRE	?=	gcc
- ifdef BUILD_DEPENDS
-  CC	=	../../build/mkdep -a
-  CXX	=	../../build/mkdep -a
-  LD	=	echo
-  COMPILE_MSG	:= Depending
- else
-  CC	?=	gcc
-  CXX	?=	g++
-  LD	?=	ld
-  COMPILE_MSG	:= Compiling
- endif
-endif
-OFILE	=	o
-
-LIBFILE	=	.a
 UIFC	=	../../uifc/
 XPDEV	=	../../xpdev/
 SBBS3	=   ../
 
-ifndef os
- os		:=	$(shell uname)
-endif
-# this line wont work with solaris unless awk in path is actually gawk 
-os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
-#os      :=	$(shell echo $(os) | awk '/.*/ { print tolower($$1)}')
-# remove '/' from "os/2"
-os      :=  $(shell echo $(os) | tr -d "/")
-
-LIBODIR :=	$(CCPRE).$(os).lib.$(BUILD)
-EXEODIR :=	$(CCPRE).$(os).exe.$(BUILD)
-
-DELETE	=	rm -f
-
-CFLAGS	+=	-I../../include/mozilla/js -I$(XPDEV) -I$(UIFC) -I$(SBBS3)
-LFLAGS	+=	-lcurses
-
-ifeq ($(os),netbsd)
- CFLAGS	+=	-D__unix__ -I/usr/pkg/include
-endif
-
-# So far, only QNX has sem_timedwait() 
-ifeq ($(os),qnx)
- LFLAGS := -lm -lsocket
-else
- CFLAGS +=      -DUSE_XP_SEMAPHORES
- USE_XP_SEMAPHORES      :=      1
-endif
-
-vpath %.c $(UIFC) $(XPDEV) $(SBBS3)
-vpath %.cpp $(SBBS3)
-
-OBJS	:=	$(LIBODIR)/filewrap.o \
-			$(LIBODIR)/chat.o \
-			$(LIBODIR)/sockwrap.o \
-			$(LIBODIR)/dirwrap.o \
-			$(LIBODIR)/genwrap.o \
-			$(LIBODIR)/sbbs_ini.o \
-			$(LIBODIR)/ini_file.o \
-			$(LIBODIR)/scfglib1.o \
-			$(LIBODIR)/scfglib2.o \
-			$(LIBODIR)/nopen.o \
-			$(LIBODIR)/userdat.o \
-			$(LIBODIR)/ars.o \
-			$(LIBODIR)/dat_rec.o \
-			$(LIBODIR)/str_util.o \
-			$(LIBODIR)/crc16.o \
-			$(LIBODIR)/load_cfg.o \
-			$(LIBODIR)/date_str.o \
-			$(LIBODIR)/spyon.o \
-			$(LIBODIR)/smblib.o \
-			$(LIBODIR)/getstats.o \
-			$(LIBODIR)/getmail.o \
-			$(LIBODIR)/umonitor.o
-
-ifdef USE_CURSES
- OBJS	+=	$(LIBODIR)/uifcc.o
-endif
-
-ifdef USE_UIFC32
- OBJS	+=	$(LIBODIR)/uifc32.o \
-		$(LIBODIR)/ciowrap.o
-endif
-
-all: $(LIBODIR) $(BUILD_DEPENDS)$(EXEODIR)/umonitor
+NEED_UIFC	:=	1
+include $(XPDEV)Common.gmake
 
 FORCE$(EXEODIR)/umonitor: $(EXEODIR) $(OBJS) $(BUILD_DEPENDS)
 
 $(EXEODIR)/umonitor: $(EXEODIR) $(OBJS) $(BUILD_DEPENDS)
 	@echo Linking $@
-	@$(CC) $(LFLAGS) $(OBJS) -o $@
-
-# Implicit C Compile Rule for utils
-$(LIBODIR)/%.o : %.c $(LIBODIR) $(BUILD_DEPENDS)
-   ifndef bcc
-	@echo $(COMPILE_MSG) $<
-   endif
-	@$(CC) $(CFLAGS) -o $@ -c $<
-
-$(LIBODIR):
-	mkdir $(LIBODIR)
-
-$(EXEODIR):
-	mkdir $(EXEODIR)
-
-clean:
-	@$(DELETE) $(LIBODIR)/*
-	@$(DELETE) $(EXEODIR)/*
-
-depend:
-	@$(DELETE) $(LIBODIR)/.depend
-	@$(DELETE) $(EXEODIR)/.depend
-	$(MAKE) BUILD_DEPENDS=FORCE
-
-FORCE:
+	@$(CC) $(LDFLAGS) $(OBJS) -o $@
 
 -include $(LIBODIR)/.depend
 -include $(EXEODIR)/.depend
diff --git a/src/xpdev/Common.gmake b/src/xpdev/Common.gmake
new file mode 100644
index 0000000000000000000000000000000000000000..cb76b1dfe119950a97fc172b01b1bf752aef2aaf
--- /dev/null
+++ b/src/xpdev/Common.gmake
@@ -0,0 +1,288 @@
+# Available Options:
+# NEED_THREADS		= Set flags suitable for threaded programs
+# NEED_CURSES       = Set flags suitable for building with the curses lib
+# NEED_JAVASCRIPT   = Set flags for use with JS
+# NEED_UIFC			= Set flags for use with UIFC
+
+UIFC_DIR	?=	$(XPDEV)../uifc/
+SBBS_SRC	?=	$(XPDEV)../sbbs3/
+
+# Set DEBUG
+ifndef DEBUG
+ ifndef RELEASE
+  DEBUG	:=	1
+ endif
+endif
+
+# VERBOSE/QUITE
+ifndef VERBOSE
+ QUIET	=	@
+endif
+
+CFLAGS	+=	-I$(SBBS_SRC)
+
+# Compiler-specific options
+ifdef bcc
+ CC		:=	bc++
+ CCPRE	:=	bcc
+ CFLAGS +=	-mm -md -D__unix__ -w-csu -w-pch -w-ccc -w-rch -w-par -w-aus
+# CFLAGS	+=	-q -w -D__unix__
+else
+ CFLAGS	+=	-MMD -Wall
+ CCPRE	?=	gcc
+ ifdef BUILD_DEPENDS
+  CC	=	$(XPDEV)../build/mkdep -a
+  CXX	=	$(XPDEV)../build/mkdep -a
+  LD	=	echo
+  COMPILE_MSG	:= Depending
+ else
+  CC	?=	gcc
+  CXX	?=	g++
+  LD	?=	ld
+  COMPILE_MSG	:= Compiling
+ endif
+endif
+
+SLASH	=	/
+OFILE	=	o
+
+ifdef DEBUG
+ BUILD	=	debug
+else
+ BUILD	=	release
+endif
+BUILDPATH	:=	$(BUILD)
+
+# Get OS
+ifndef os
+ os		=	$(shell uname)
+endif
+os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
+
+LIBODIR :=	$(CCPRE).$(os).lib.$(BUILDPATH)
+EXEODIR :=	$(CCPRE).$(os).exe.$(BUILDPATH)
+LDFLAGS	+=	-L$(LIBODIR)
+
+DELETE	=	rm -fv
+EXEFILE	:=
+
+ifeq ($(os),openbsd)
+LIBFILE =	.so.0.0
+else
+ ifeq ($(os),darwin)
+  LIBFILE =	.dylib
+ else
+  LIBFILE	=	.so
+ endif
+endif
+LIBPREFIX =	lib
+
+# OS Specific Flags
+ifeq ($(os),sunos)    # Solaris
+ CFLAGS	+= -D__solaris__ -DNEEDS_DAEMON -DNEEDS_FORKPTY
+endif
+ifeq ($(os),netbsd)	# NetBSD
+ CFLAGS	+=	-D__unix__ -I/usr/pkg/include -I/usr/pkg/pthreads/include -DNEEDS_FORKPTY
+endif
+ifeq ($(os),darwin)
+ CFLAGS +=  -D__unix__ -fno-common -D__DARWIN__
+ LDFLAGS +=  -lm
+endif
+
+# PThread-specific flags
+ifeq ($(os),linux)    # Linux
+ ifndef THREADS_ACTUALLY_WORK
+  PTHREAD_CFLAGS    += -D_THREAD_SUID_BROKEN
+ endif
+endif
+PTHREAD_CFLAGS    += -D_THREAD_SAFE -D_REENTRANT
+ifeq ($(os),freebsd)    # FreeBSD
+ PTHREAD_CFLAGS    += -DUSE_XP_SEMAPHORES
+ PTHREAD_LDFLAGS    +=    -pthread
+ XP_SEM    :=    1
+else
+ ifeq ($(os),openbsd)    # OpenBSD
+  PTHREAD_CFLAGS    += -DUSE_XP_SEMAPHORES
+  PTHREAD_LDFLAGS    +=    -pthread
+  XP_SEM    :=    1
+ else
+  ifeq ($(os),netbsd)    # NetBSD
+   PTHREAD_CFLAGS    += -D__unix__ -DUSE_XP_SEMAPHORES
+   PTHREAD_LDFLAGS    +=    -L/usr/pkg/lib -L/usr/pkg/pthreads/lib -lpthread
+   XP_SEM    :=    1
+  else
+   ifeq ($(os),qnx)    # QNX
+   else
+    ifeq ($(os),darwin)    # Darwin/Mac OS X
+     PTHREAD_CFLAGS    += -D__unix__ -DUSE_XP_SEMAPHORES -D__DARWIN__
+     PTHREAD_LDFLAGS    += -lpthread
+     XP_SEM    := 1
+    else
+     ifeq ($(os),solaris)  # Solaris
+      PTHREAD_CFLAGS    +=    -D_POSIX_PTHREAD_SEMANTICS
+     else            # Linux / Other UNIX
+      XP_SEM :=    1
+      PTHREAD_CFLAGS    += -DUSE_XP_SEMAPHORES
+      ifdef bcc
+       PTHREAD_LDFLAGS    +=    libpthread.a
+      else
+       PTHREAD_LDFLAGS    +=    -lpthread
+      endif
+     endif
+    endif
+   endif
+  endif
+ endif
+endif
+
+ifdef NEED_THREADS
+ CFLAGS += $(PTHREAD_CFLAGS)
+ LDFLAGS	+= $(PTHREAD_LDFLAGS)
+endif
+
+ifdef DEBUG
+ ifdef bcc
+  CFLAGS	+=	-v -y -0d
+ else
+  CFLAGS	+=	-ggdb
+ endif
+ CFLAGS	+=	-D_DEBUG
+ ODIR	:=	$(ODIR).debug
+else # RELEASE
+ CFLAGS	+= -O3
+ ODIR	:=	$(ODIR).release
+endif
+
+# UIFC Related stuff
+UIFC_CFLAGS	+=	-I$(UIFC)
+UIFC_OBJS =	$(LIBODIR)/uifcx.o
+ifdef USE_FLTK
+ UIFC_CFLAGS +=	-DUSE_FLTK -I$(XPDEV)/../../include/fltk
+ UIFC_LDFLAGS += -L$(XPDEV)../../lib/fltk/$(os) -L/usr/X11R6/lib -lm -lfltk -lX11
+ UIFC_OBJS+=	$(LIBODIR)/uifcfltk.o
+endif
+ifdef USE_DIALOG
+ LDFLAGS	+=	-L$(XPDEV)../libdialog -ldialog $(CURSESLIB)
+ CFLAGS	+=	-I$(XPDEV)../libdialog -DUSE_DIALOG
+ UIFC_NEED_CURSES	:=	1
+endif
+ifdef USE_CURSES
+ UIFC_CFLAGS +=	-DUSE_CURSES
+ UIFC_LDFLAGS += $(CURSES_LDFLAGS)
+ UIFC_OBJS +=	$(LIBODIR)/uifcc.o
+ UIFC_NEED_CURSES	:=	1
+endif
+ifdef USE_UIFC32
+ UIFC_CFLAGS +=	-DUSE_UIFC32
+ UIFC_LDFLAGS += $(CURSES_LDFLAGS)
+ UIFC_OBJS +=	$(LIBODIR)/uifc32.o
+ UIFC_OBJS +=	$(LIBODIR)/ciowrap.o
+ UIFC_NEED_CURSES	:=	1
+endif
+ifdef NEED_UIFC
+ CFLAGS	+=	$(UIFC_CFLAGS)
+ LDFLAGS	+=	$(UIFC_LDFLAGS)
+endif
+
+# Curses Stuff
+ifeq ($(os),qnx)
+ CURSES_LDFLAGS += -lncurses
+else
+ ifeq ($(os),netbsd)
+  CURSES_CFLAGS += -I/usr/pkg/include
+  CURSES_LDFLAGS += -lncurses
+ else
+  CURSES_LDFLAGS += -lcurses
+ endif
+endif
+
+ifdef NEED_CURSES
+ CFLAGS +=	$(CURSES_CFLAGS)
+ LDFLAGS	+=	$(CURSES_LDFLAGS)
+endif
+ifdef UIFC_NEED_CURSES
+ UIFC_CFLAGS	+=	$(CURSES_CFLAGS)
+ UIFC_LDFLAGS	+=	$(CURSES_LDFLAGS)
+endif
+
+JS_CFLAGS += -DJAVASCRIPT
+ifdef JSINCLUDE
+ JS_CFLAGS += -I$(JSINCLUDE)
+else
+ JS_CFLAGS += -I$(XPDEV)../../include/mozilla/js
+endif
+ifndef JSLIBDIR
+ JSLIBDIR := $(XPDEV)../../lib/mozilla/js/$(os).$(BUILD)
+endif
+ifndef JSLIB
+ JSLIB	:=	js
+endif
+ifndef NSPRDIR
+ NSPRDIR := $(XPDEV)../../lib/mozilla/nspr/$(os).$(BUILD)
+endif
+JS_LDFLAGS += -L$(JSLIBDIR) -l$(JSLIB)
+#The following is needed for nspr support on Linux
+ifeq ($(os),linux)
+ JS_LDFLAGS	+=	-ldl
+endif
+JS_LDFLAGS	+=	-lnspr4 -L$(NSPRDIR)
+
+ifdef NEED_JAVASCRIPT
+ CFLAGS	+=	$(JS_CFLAGS)
+ LDFLAGS	+=	$(JS_LDFLAGS)
+endif
+
+vpath %.c $(XPDEV)
+vpath %.c $(UIFC_DIR)
+vpath %.c $(SBBS_SRC)
+vpath %.cpp $(UIFC_DIR)
+vpath %.cpp $(SBBS_SRC)
+
+CFLAGS	+=	-I$(XPDEV) -I$(UIFC_DIR) -I$(SBBS_SRC)
+
+SBBSDEFS	:=
+-include targets.mk
+-include objects.mk		# defines $(OBJS)
+ifdef NEED_UIFC
+ OBJS	+=	$(UIFC_OBJS)
+endif
+ifdef XP_SEM
+ OBJS	+= $(LIBODIR)$(SLASH)xpsem.$(OFILE)
+endif
+-include sbbsdefs.mk		# defines $(SBBSDEFS)
+
+# Implicit C Compile Rule for SBBS
+$(LIBODIR)/%.o : %.c $(BUILD_DEPENDS)
+   ifndef bcc
+	@echo $(COMPILE_MSG) $<
+   endif
+	$(QUIET)$(CC) $(CFLAGS) $(SBBSDEFS) -o $@ -c $<
+
+# Implicit C++ Compile Rule for SBBS
+$(LIBODIR)/%.o : %.cpp $(BUILD_DEPENDS)
+   ifndef bcc
+	@echo $(COMPILE_MSG) $<
+   endif
+	$(QUIET)$(CXX) $(CFLAGS) $(SBBSDEFS) -o $@ -c $<
+
+$(LIBODIR):
+	$(QUIET)mkdir $(LIBODIR)
+
+$(EXEODIR):
+	$(QUIET)mkdir $(EXEODIR)
+
+clean:
+	$(QUIET)$(DELETE) $(LIBODIR)$(SLASH)*
+	$(QUIET)$(DELETE) $(EXEODIR)$(SLASH)*
+
+depend:
+	$(QUIET)$(DELETE) $(LIBODIR)/.depend
+	$(QUIET)$(DELETE) $(EXEODIR)/.depend
+	$(QUIET)$(MAKE) BUILD_DEPENDS=FORCE
+
+FORCE:
+
+-include $(LIBODIR)/.depend
+-include $(EXEODIR)/.depend
+-include $(LIBODIR)/*.d
+-include $(EXEODIR)/*.d
diff --git a/src/xpdev/GNUmakefile b/src/xpdev/GNUmakefile
index d243e6d4f37aa8a1c99f7f43816f0612ae8210fc..e2a86bc82d656488d6fcc1a18241611a5cc8eb82 100644
--- a/src/xpdev/GNUmakefile
+++ b/src/xpdev/GNUmakefile
@@ -11,116 +11,23 @@
 #########################################################################
 
 # $Id$
+NEED_THREADS	:=	1
 
-# Macros
-ifndef DEBUG
-ifndef RELEASE
-DEBUG	:=	1
-endif
-endif
-
-ifdef bcc
- CC		:=	bc++
- CCPRE	:=	bcc
- CFLAGS	+=	-q -w -D__unix__
-else
- CC		:=	gcc
- CCPRE	:=	gcc
- CFLAGS	+=	-Wall -O
-endif
-
-SLASH	=	/
-OFILE	=	o
-
-ifndef os
- os		=	$(shell uname)
-endif
-os      :=	$(shell echo $(os) | tr "[A-Z]" "[a-z]")
-#os      :=	$(shell echo $(os) | awk '/.*/ { print tolower($$1)}')
-
-ifdef bcc
- ODIR	:=	bcc.$(os)
-else
- ODIR	:=	gcc.$(os)
-endif
-
-DELETE	=	rm -fv
-
-CFLAGS	+= -D_THREAD_SAFE
-ifeq ($(os),freebsd)	# FreeBSD
- CFLAGS		+= -DUSE_XP_SEMAPHORES
- LFLAGS	:=	-pthread
- XP_SEM :=	1
-else
- ifeq ($(os),openbsd)	# OpenBSD
-  CFLAGS	+= -DUSE_XP_SEMAPHORES
-  LFLAGS	:=	-pthread
-  XP_SEM :=	1
- else
-  ifeq ($(os),netbsd)	# NetBSD
-   CFLAGS	+= -D__unix__ -DUSE_XP_SEMAPHORES -I/usr/pkg/include -I/usr/pkg/pthreads/include
-   LFLAGS	:=	-L/usr/pkg/lib -L/usr/pkg/pthreads/lib -lpthread
-   XP_SEM :=	1
-  else
-   ifeq ($(os),qnx)	# QNX
-    LFLAGS	:= 
-   else
-    ifeq ($(os),darwin)	# Darwin/Mac OS X
-     CFLAGS	+= -D__unix__ -DUSE_XP_SEMAPHORES -D__DARWIN__
-     LFLAGS	+= -lpthread
-     XP_SEM	:= 1
-    else			# Linux / Other UNIX
-     XP_SEM :=	1
-     CFLAGS	+= -DUSE_XP_SEMAPHORES
-     ifdef bcc
-      LFLAGS	:=	libpthread.a
-     else
-      LFLAGS	:=	-lpthread
-     endif
-    endif
-   endif
-  endif
- endif
-endif
-
-ifdef DEBUG
- ifdef bcc
-  CFLAGS	+=	-v -y
- else
-  CFLAGS	+=	-g
- endif
- CFLAGS	+=	-D_DEBUG
- ODIR	:=	$(ODIR).debug
-else # RELEASE
- ODIR	:=	$(ODIR).release
-endif
-
-include objects.mk		# defines $(OBJS)
-include targets.mk		# defines all and clean targets
-
-ifdef XP_SEM
- OBJS	+= $(ODIR)$(SLASH)xpsem.$(OFILE)
-endif
-
-# Implicit C Compile Rule
-$(ODIR)/%.o : %.c
-	@echo Compiling $<
-	@$(CC) $(CFLAGS) -o $@ -c $<
-
-# Create output directories
-$(ODIR):
-	mkdir $(ODIR)
+XPDEV	:=	./
+include $(XPDEV)Common.gmake
 
 # Executable Build Rule
-$(WRAPTEST): $(ODIR)/wraptest.o $(OBJS)
+$(WRAPTEST): $(LIBODIR)/wraptest.o $(OBJS)
 	@echo Linking $@
-	@$(CC) $(CFLAGS) -o $@ $(LFLAGS) $^
+	$(QUIET)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $^
 
-lib: $(ODIR)/libxpdev.so $(ODIR)/libxpdev.a
+lib: $(EXEODIR)/libxpdev.so $(EXEODIR)/libxpdev.a
 
-$(ODIR)/libxpdev.so: $(OBJS)
-	gcc -shared $(OBJS) -o $(ODIR)/libxpdev.so
+$(EXEODIR)/libxpdev.so: $(OBJS)
+	@echo Linking $@
+	$(QUIET)gcc -shared $(OBJS) -o $(EXEODIR)/libxpdev.so
 
-$(ODIR)/libxpdev.a: $(OBJS)
-	ar -r $(ODIR)/libxpdev.a $(OBJS)
-	ranlib $(ODIR)/libxpdev.a
+$(EXEODIR)/libxpdev.a: $(OBJS)
+	@echo Linking $@
+	$(QUIET)ar -r $(EXEODIR)/libxpdev.a $(OBJS)
+	$(QUIET)ranlib $(EXEODIR)/libxpdev.a
diff --git a/src/xpdev/objects.mk b/src/xpdev/objects.mk
index 09286d9a4920db14766441fb7a87fa28150c09da..903e2556b24d6d8b2a9ed6a6ce1e958671b15126 100644
--- a/src/xpdev/objects.mk
+++ b/src/xpdev/objects.mk
@@ -4,12 +4,12 @@
 
 # $Id$
 
-# ODIR, SLASH, and OFILE must be pre-defined
+# LIBODIR, SLASH, and OFILE must be pre-defined
 
 OBJS = \
-	$(ODIR)$(SLASH)genwrap.$(OFILE) \
-	$(ODIR)$(SLASH)conwrap.$(OFILE) \
-	$(ODIR)$(SLASH)dirwrap.$(OFILE) \
-	$(ODIR)$(SLASH)filewrap.$(OFILE) \
-	$(ODIR)$(SLASH)threadwrap.$(OFILE) \
-	$(ODIR)$(SLASH)semwrap.$(OFILE)
+	$(LIBODIR)$(SLASH)genwrap.$(OFILE) \
+	$(LIBODIR)$(SLASH)conwrap.$(OFILE) \
+	$(LIBODIR)$(SLASH)dirwrap.$(OFILE) \
+	$(LIBODIR)$(SLASH)filewrap.$(OFILE) \
+	$(LIBODIR)$(SLASH)threadwrap.$(OFILE) \
+	$(LIBODIR)$(SLASH)semwrap.$(OFILE)
diff --git a/src/xpdev/targets.mk b/src/xpdev/targets.mk
index 353e706fda4b03b01b5fda0bf4717c346f665072..b73e66eee5806eb9ae80a1fcd11fbaf629fdcf81 100644
--- a/src/xpdev/targets.mk
+++ b/src/xpdev/targets.mk
@@ -6,9 +6,6 @@
 
 # ODIR, SLASH, LIBFILE, EXEFILE, and DELETE must be pre-defined
 
-WRAPTEST	= $(ODIR)$(SLASH)wraptest$(EXEFILE) 
+WRAPTEST	= $(EXEODIR)$(SLASH)wraptest$(EXEFILE) 
 
-all: $(ODIR) $(WRAPTEST)
-
-clean:
-	@$(DELETE) $(ODIR)$(SLASH)*
+all: $(EXEODIR) $(LIBODIR) $(WRAPTEST)