--- a/Makefile.in
+++ b/Makefile.in
@@ -11,11 +11,15 @@ DEFS = @DEFS@
 CPPFLAGS = @CPPFLAGS@ $(DEFS)
 
 # dependencies
+@COND_WITH_LIBTWIN_FALSE@cond_pb_twin =
+@COND_WITH_LIBTWIN_TRUE@cond_pb_twin = $(pb_twin)
+LIBTWIN = @LIBTWIN@
 twin_CFLAGS = @twin_CFLAGS@
 twin_LDFLAGS = @twin_LIBS@
 
 # other programs
 INSTALL = @INSTALL@
+SHELL = @SHELL@
 
 # paths
 prefix = @prefix@
--- a/configure.ac
+++ b/configure.ac
@@ -46,8 +46,9 @@ AS_IF([test "x$with_twin" != xno],
 		fi],
 		[])])
 
+AM_CONDITIONAL([COND_WITH_LIBTWIN], [test "x$with_twin" = "xyes"])
 
-mkdir -p discover ui/test ui/common lib/talloc lib/pb-protocol lib/list \
-	      lib/waiter lib/log
+mkdir -p discover lib/list lib/log lib/pb-protocol lib/talloc lib/waiter \
+	test ui/common ui/ncurses ui/test ui/twin
 
 AC_OUTPUT
--- a/rules.mk
+++ b/rules.mk
@@ -1,5 +1,4 @@
 
-
 VPATH = $(srcdir)
 
 CPPFLAGS += -I$(top_srcdir) -I$(top_srcdir)/lib -I$(builddir)
@@ -8,68 +7,111 @@ CPPFLAGS += -I$(top_srcdir) -I$(top_srcd
 DEFS += '-DPREFIX="$(prefix)"' '-DPKG_SHARE_DIR="$(pkgdatadir)"' \
 	'-DLOCAL_STATE_DIR="$(localstatedir)"'
 
-#uis = ui/twin/pb-twin
-uis = ui/test/pb-test
-#parsers = native yaboot kboot
+# programs
+pb_discover = discover/pb-discover
+pb_cui = ui/ncurses/pb-cui
+pb_test = ui/test/pb-test
+pb_twin = ui/twin/pb-twin
+parser_test = test/parser-test
+
+# install targets and components
+daemons = $(pb_discover)
+#parsers = kboot native yaboot (todo)
 parsers = kboot
+uis = $(pb_test) $(cond_pb_twin)
+tests = $(parser_test)
+
+# other to install
 artwork = background.jpg cdrom.png hdd.png usbpen.png tux.png cursor.gz
 
+# client/daemon lib objs
+list_objs = lib/list/list.o
 log_objs = lib/log/log.o
+protocol_objs = lib/pb-protocol/pb-protocol.o
 talloc_objs = lib/talloc/talloc.o
-list_objs = lib/list/list.o
 waiter_objs = lib/waiter/waiter.o
-server_objs = lib/pb-protocol/pb-protocol.o
+
+# daemon objs
 parser_objs = discover/parser.o discover/parser-utils.o \
-	      $(foreach p, $(parsers), discover/$(p)-parser.o)
+	$(foreach p, $(parsers), discover/$(p)-parser.o)
+discover_objs = discover/udev.o discover/discover-server.o \
+	discover/device-handler.o discover/paths.o
 
-parser_test_objs = parser-test.o $(parser_objs)
+# client objs
+ui_common_objs = ui/common/discover-client.o
+ncurses_objs =
+twin_objs = ui/twin/pb-twin.o
 
-all: $(uis) discover/pb-discover
+# headers
+discover_all_headers = $(wildcard $(top_srcdir)/discover/*.h)
+lib_headers = $(wildcard $(top_srcdir)/lib/*/*.h)
+ui_all_headers = $(wildcard $(top_srcdir)/ui/*/*.h)
 
-# twin gui
-ui/twin/pb-twin: LDFLAGS+=$(twin_LDFLAGS)
-ui/twin/pb-twin: CFLAGS+=$(twin_CFLAGS)
+# object collections
+lib_objs = $(list_objs) $(log_objs) $(protocol_objs) $(talloc_objs) \
+	$(waiter_objs)
+
+daemon_objs = $(lib_objs) $(parser_objs) $(discover_objs)
+daemon_headers = $(lib_headers) $(discover_all_headers)
+
+client_objs = $(lib_objs) $(ui_common_objs)
+client_headers = $(lib_headers) $(discover_all_headers) $(ui_all_headers)
 
-pb_twin_objs = ui/twin/pb-twin.o ui/common/devices.o
+all: $(uis) $(daemons)
 
-ui/twin/pb-twin: $(pb_twin_objs)
+# ncurses cui
+pb_cui_objs = $(client_objs) $(ncurses_objs) ui/ncurses/ps3-cui.o
+$(pb_cui_objs): $(client_headers)
+
+$(pb_cui): LDFLAGS+=-lncurses
+
+$(pb_cui): $(pb_cui_objs)
 	$(LINK.o) -o $@ $^
 
 # test ui
-pb_test_objs = ui/test/pb-test.o ui/common/discover-client.o \
-	$(log_objs) $(talloc_objs) $(server_objs) $(list_objs)
+pb_test_objs = $(client_objs) ui/test/pb-test.o
+$(pb_test_objs): $(client_headers)
+
+$(pb_test): $(pb_test_objs)
+	$(LINK.o) -o $@ $^
 
-ui/test/pb-test: $(pb_test_objs)
+# twin gui
+pb_twin_objs = $(client_objs) $(twin_objs) ui/twin/ps3-twin.o
+$(pb_twin_objs): $(client_headers)
+
+$(pb_twin): LDFLAGS+=$(twin_LDFLAGS) $(LIBTWIN)
+$(pb_twin): CFLAGS+=$(twin_CFLAGS)
+
+$(pb_twin): $(pb_twin_objs)
 	$(LINK.o) -o $@ $^
 
 # discovery daemon
-#pb_discover_objs = discover/params.o discover/parser.o discover/paths.o \
-#	      discover/yaboot-cfg.o \
-#	      $(foreach p,$(parsers),discover/$(p)-parser.o)
-
-pb_discover_objs = discover/pb-discover.o discover/udev.o \
-		   discover/discover-server.o discover/device-handler.o \
-		   discover/paths.o $(talloc_objs) $(server_objs) \
-		   $(parser_objs) $(list_objs) $(waiter_objs) $(log_objs)
+pb_discover_objs = $(daemon_objs) discover/pb-discover.o
+$(pb_discover_objs): $(daemon_headers)
 
-discover/pb-discover: $(pb_discover_objs)
+$(pb_discover): $(pb_discover_objs)
 	$(LINK.o) -o $@ $^
 
+# parser-test
+parser_test_objs = $(parser_objs) test/parser-test.o
+$(parser_test_objs): $(daemon_headers)
 
-parser-test: $(parser_test_objs)
+$(parser_test): $(parser_test_objs)
 	$(LINK.o) -o $@ $^
 
+parser-test: $(parser_test)
+
 install: all
 	$(INSTALL) -d $(DESTDIR)$(sbindir)/
-	$(INSTALL) discover/pb-discover $(uis) $(DESTDIR)$(sbindir)/
+	$(INSTALL) $(daemons) $(uis) $(DESTDIR)$(sbindir)/
 	$(INSTALL) -d $(DESTDIR)$(pkgdatadir)/artwork/
 	$(INSTALL) $(addprefix $(top_srcdir)/ui/twin/artwork/,$(artwork)) \
 		$(DESTDIR)$(pkgdatadir)/artwork/
 
-dist:	$(PACKAGE)-$(VERSION).tar.gz
+dist: $(PACKAGE)-$(VERSION).tar.gz
 
-check:	parser-test
-	devices/parser-test.sh
+check: parser-test
+	$(SHELL) test/parser-test.sh
 
 distcheck: dist
 	tar -xvf $(PACKAGE)-$(VERSION).tar.gz
@@ -79,16 +121,29 @@ $(PACKAGE)-$(VERSION).tar.gz: $(PACKAGE)
 	tar czvf $@ $^
 
 $(PACKAGE)-$(VERSION): clean
-	for f in $$(git-ls-files); do \
+	for f in $$(git --git-dir=$(top_srcdir)/.git ls-files); do \
 		d=$@/$$(dirname $$f); \
 		mkdir -p $$d; \
-		cp -a $$f $$d; \
+		cp -a $(top_srcdir)/$$f $$d; \
 	done
 clean:
 	rm -rf $(PACKAGE)-$(VERSION)
 	rm -f $(uis)
-	rm -f $(pb_twin_objs) $(pb_test_objs)
+	rm -f $(pb_cui_objs)
+	rm -f $(pb_test_objs)
+	rm -f $(pb_twin_objs)
+	rm -f $(daemons)
 	rm -f $(pb_discover_objs)
-	rm -f discover/pb-discover
-	rm -f ui/test/pb-test
+	rm -f $(tests)
+	rm -f $(parser_test_objs)
 
+maintainer-clean: clean
+	-rm -f $(top_srcdir)/aclocal.m4
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -f $(top_srcdir)/config.h.in
+	-rm -f $(top_srcdir)/configure
+	-rm -f config.h
+	-rm -f config.log
+	-rm -f config.status
+	-rm -f Makefile
+	-rm -f $(PACKAGE)-$(VERSION).tar.gz
