diff --git a/changes/src_ext b/changes/src_ext
new file mode 100644
index 0000000000000000000000000000000000000000..a1b2a2198f33859c0448e6a6652dd8b7868caf14
--- /dev/null
+++ b/changes/src_ext
@@ -0,0 +1,3 @@
+  o Code refactoring:
+    - Source files taken from other packages now reside in src/ext;
+      previously they were scattered around the rest of Tor.
diff --git a/src/common/include.am b/src/common/include.am
index ba08aa7e5a6a6a82f94242fa788052f3e09ec2d3..7299a47afb159f0369bd96e226149a7e0ce7cfa4 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -9,7 +9,7 @@ EXTRA_DIST+= \
 AM_CPPFLAGS += -I$(srcdir)/src/common -Isrc/common
 
 if USE_OPENBSD_MALLOC
-libor_extra_source=src/common/OpenBSD_malloc_Linux.c
+libor_extra_source=src/ext/OpenBSD_malloc_Linux.c
 else
 libor_extra_source=
 endif
@@ -44,7 +44,6 @@ COMMONHEADERS = \
   src/common/container.h			\
   src/common/crypto.h				\
   src/common/di_ops.h				\
-  src/common/ht.h				\
   src/common/memarea.h				\
   src/common/mempool.h				\
   src/common/procmon.h				\
diff --git a/src/common/OpenBSD_malloc_Linux.c b/src/ext/OpenBSD_malloc_Linux.c
similarity index 100%
rename from src/common/OpenBSD_malloc_Linux.c
rename to src/ext/OpenBSD_malloc_Linux.c
diff --git a/src/or/eventdns.c b/src/ext/eventdns.c
similarity index 100%
rename from src/or/eventdns.c
rename to src/ext/eventdns.c
diff --git a/src/or/eventdns.h b/src/ext/eventdns.h
similarity index 100%
rename from src/or/eventdns.h
rename to src/ext/eventdns.h
diff --git a/src/common/ht.h b/src/ext/ht.h
similarity index 100%
rename from src/common/ht.h
rename to src/ext/ht.h
diff --git a/src/ext/include.am b/src/ext/include.am
new file mode 100644
index 0000000000000000000000000000000000000000..97e7e46b4685ff0de75b726c01312d078d037059
--- /dev/null
+++ b/src/ext/include.am
@@ -0,0 +1,12 @@
+
+AM_CPPFLAGS += -I$(srcdir)/src/ext -Isrc/ext
+
+EXTHEADERS = \
+  src/ext/ht.h		\
+  src/ext/eventdns.h	\
+  src/ext/tinytest.h	\
+  src/ext/tinytest_macros.h
+
+noinst_HEADERS+= $(EXTHEADERS)
+
+
diff --git a/src/test/tinytest.c b/src/ext/tinytest.c
similarity index 100%
rename from src/test/tinytest.c
rename to src/ext/tinytest.c
diff --git a/src/test/tinytest.h b/src/ext/tinytest.h
similarity index 100%
rename from src/test/tinytest.h
rename to src/ext/tinytest.h
diff --git a/src/test/tinytest_demo.c b/src/ext/tinytest_demo.c
similarity index 100%
rename from src/test/tinytest_demo.c
rename to src/ext/tinytest_demo.c
diff --git a/src/test/tinytest_macros.h b/src/ext/tinytest_macros.h
similarity index 100%
rename from src/test/tinytest_macros.h
rename to src/ext/tinytest_macros.h
diff --git a/src/include.am b/src/include.am
index 965a4940420b82c0349a606ff81aed1e02190ec4..d0693e25b09691a0924c7600f7ea71272077bb4b 100644
--- a/src/include.am
+++ b/src/include.am
@@ -1,6 +1,7 @@
+include src/ext/include.am
 include src/common/include.am
 include src/or/include.am
 include src/test/include.am
 include src/tools/include.am
 include src/win32/include.am
-include src/config/include.am
\ No newline at end of file
+include src/config/include.am
diff --git a/src/or/include.am b/src/or/include.am
index 90dea44ba83d394b3f1335fd4fdc7ca52f7ac914..749206151ac34b6f542581c0cd12ade8cf0e6600 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -12,7 +12,7 @@ EXTRA_DIST+= src/or/ntmain.c src/or/or_sha1.i src/or/Makefile.nmake
 if USE_EXTERNAL_EVDNS
 evdns_source=
 else
-evdns_source=src/or/eventdns.c
+evdns_source=src/ext/eventdns.c
 endif
 
 src_or_libtor_a_SOURCES = \
@@ -110,7 +110,6 @@ ORHEADERS = \
 	src/or/dirvote.h				\
 	src/or/dns.h					\
 	src/or/dnsserv.h				\
-	src/or/eventdns.h				\
 	src/or/eventdns_tor.h				\
 	src/or/geoip.h					\
 	src/or/hibernate.h				\
diff --git a/src/test/include.am b/src/test/include.am
index 03fef23375a158639ba249778ad479a72471e585..bdfe498d6618d62bd803df1e99f6c2989c56bc41 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -5,7 +5,7 @@ noinst_PROGRAMS+= src/test/test src/test/test-child src/test/bench
 src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
         -DLOCALSTATEDIR="\"$(localstatedir)\"" \
         -DBINDIR="\"$(bindir)\""	       \
-	-I"$(top_srcdir)/src/or"
+	-I"$(top_srcdir)/src/or" -I"$(top_srcdir)/src/ext"
 
 # -L flags need to go in LDFLAGS. -l flags need to go in LDADD.
 # This seems to matter nowhere but on Windows, but I assure you that it
@@ -24,7 +24,7 @@ src_test_test_SOURCES = \
 	src/test/test_replay.c \
 	src/test/test_util.c \
 	src/test/test_config.c \
-	src/test/tinytest.c
+	src/ext/tinytest.c
 
 src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS)
 
@@ -48,8 +48,5 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-crypt
 	@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@
 
 noinst_HEADERS+= \
-	src/test/tinytest.h \
-	src/test/tinytest_macros.h \
 	src/test/test.h
 
-