diff --git a/.gitignore b/.gitignore
index ed7704c3405e611454f2e8f80b458ed55ce7cc0d..8426c0a7624f5ce3df0dedf64a625ccc262739bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,6 @@ menuselect-tree
 *.pyc
 *.gcno
 *.gcda
+latex
+doxygen.log
+
diff --git a/Makefile b/Makefile
index 585e4a6a131aab946662a932bbf6a2bb8fbf7196..4ed092a0a6a5068fe46d27768a8333e52fc092ce 100644
--- a/Makefile
+++ b/Makefile
@@ -430,6 +430,8 @@ _clean:
 	rm -f main/version.c
 	rm -f doc/core-en_US.xml
 	rm -f doc/full-en_US.xml
+	rm -f doxygen.log
+	rm -rf latex
 	@$(MAKE) -C menuselect clean
 	cp -f .cleancount .lastclean
 
@@ -445,6 +447,7 @@ distclean: $(SUBDIRS_DIST_CLEAN) _clean
 	rm -f include/asterisk/autoconfig.h
 	rm -f include/asterisk/buildopts.h
 	rm -rf doc/api
+	rm -f doc/asterisk-ng-doxygen
 	rm -f build_tools/menuselect-deps
 
 datafiles: _all doc/core-en_US.xml
@@ -742,8 +745,30 @@ webvmail:
 	@echo " +-------------------------------------------+"
 
 progdocs:
-	(cat contrib/asterisk-ng-doxygen; echo "HAVE_DOT=$(HAVEDOT)"; \
-	echo "PROJECT_NUMBER=$(ASTERISKVERSION)") | doxygen -
+# Note, Makefile conditionals must not be tabbed out. Wasted hours with that.
+	@cp doc/asterisk-ng-doxygen.in doc/asterisk-ng-doxygen
+ifeq ($(DOXYGEN),:)
+	@echo "Doxygen is not installed.  Please install and re-run the configuration script."
+else
+ifeq ($(DOT),:)
+	@echo "DOT is not installed. Doxygen will not produce any diagrams. Please install and re-run the configuration script."
+else
+	# Enable DOT
+	@echo "HAVE_DOT = YES" >> doc/asterisk-ng-doxygen
+endif
+	# Set Doxygen PROJECT_NUMBER variable
+ifneq ($(ASTERISKVERSION),UNKNOWN__and_probably_unsupported)
+	@echo "PROJECT_NUMBER = $(ASTERISKVERSION)" >> doc/asterisk-ng-doxygen
+else
+	echo "Asterisk Version is unknown, not configuring Doxygen PROJECT_NUMBER."
+endif
+	# Validate and auto-update local copy
+	@doxygen -u doc/asterisk-ng-doxygen
+	# Run Doxygen
+	@doxygen doc/asterisk-ng-doxygen
+	# Remove configuration backup file
+	@rm -f doc/asterisk-ng-doxygen.bak
+endif
 
 install-logrotate:
 	if [ ! -d "$(DESTDIR)$(ASTETCDIR)/../logrotate.d" ]; then \
diff --git a/doc/.gitignore b/doc/.gitignore
index 27acdb3249f7ba9b8a95bfd65ddd5eafec1b679f..7d534dff241e390fb7598e401d3adaa36e89397f 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -1 +1,3 @@
 core-en_US.xml
+api
+asterisk-ng-doxygen
diff --git a/contrib/asterisk-ng-doxygen b/doc/asterisk-ng-doxygen.in
similarity index 100%
rename from contrib/asterisk-ng-doxygen
rename to doc/asterisk-ng-doxygen.in