diff --git a/docs/doxygen/Doxyfile b/docs/doxygen/Doxyfile
index b640c41549..0037b15063 100644
--- a/docs/doxygen/Doxyfile
+++ b/docs/doxygen/Doxyfile
@@ -772,6 +772,8 @@ INPUT = main.dox \
regressionTesting.dox \
native_libs.dox \
modDevPython.dox \
+ modFileIngestTutorial.dox \
+ modDSIngestTutorial.dox \
debugTsk.dox \
../../Core/src \
../../CoreLibs/src \
@@ -867,7 +869,7 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH = .
+IMAGE_PATH = images/
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
diff --git a/docs/doxygen/images/bigAndRoundFiles.png b/docs/doxygen/images/bigAndRoundFiles.png
new file mode 100644
index 0000000000..fa6430e7d8
Binary files /dev/null and b/docs/doxygen/images/bigAndRoundFiles.png differ
diff --git a/docs/doxygen/images/demoScript_folder.png b/docs/doxygen/images/demoScript_folder.png
new file mode 100644
index 0000000000..01d7d16f4c
Binary files /dev/null and b/docs/doxygen/images/demoScript_folder.png differ
diff --git a/docs/doxygen/images/ingest-modules.PNG b/docs/doxygen/images/ingest-modules.PNG
new file mode 100644
index 0000000000..9941a0dfb3
Binary files /dev/null and b/docs/doxygen/images/ingest-modules.PNG differ
diff --git a/docs/doxygen/viewer_image.JPG b/docs/doxygen/images/viewer_image.JPG
old mode 100755
new mode 100644
similarity index 100%
rename from docs/doxygen/viewer_image.JPG
rename to docs/doxygen/images/viewer_image.JPG
diff --git a/docs/doxygen/main.dox b/docs/doxygen/main.dox
index 22bcd097ad..094c61f612 100644
--- a/docs/doxygen/main.dox
+++ b/docs/doxygen/main.dox
@@ -9,8 +9,8 @@ If these pages don't answer your question, then send the question to the Writing Python or Java Modules
If you want to write Java or Python modules, then there are some tutorials and detailed pages in this document. The Python tutorials include:
-- File Ingest Modules: http://www.basistech.com/python-autopsy-module-tutorial-1-the-file-ingest-module/
-- Data Source Ingest Modules: http://www.basistech.com/python-autopsy-module-tutorial-2-the-data-source-ingest-module/
+- File Ingest Modules: \subpage mod_python_file_ingest_tutorial_page
+- Data Source Ingest Modules: \subpage mod_python_ds_ingest_tutorial_page
- Report Modules: http://www.basistech.com/python-autopsy-module-tutorial-3-the-report-module/
This document contains the following pages:
diff --git a/docs/doxygen/modDSIngestTutorial.dox b/docs/doxygen/modDSIngestTutorial.dox
new file mode 100644
index 0000000000..e457cbd7d0
--- /dev/null
+++ b/docs/doxygen/modDSIngestTutorial.dox
@@ -0,0 +1,5 @@
+/*! \page mod_python_ds_ingest_tutorial_page Python Tutorial #2: Writing a Data Source Ingest Module
+
+
+
+*/
\ No newline at end of file
diff --git a/docs/doxygen/modFileIngestTutorial.dox b/docs/doxygen/modFileIngestTutorial.dox
new file mode 100644
index 0000000000..def7e91c2a
--- /dev/null
+++ b/docs/doxygen/modFileIngestTutorial.dox
@@ -0,0 +1,154 @@
+/*! \page mod_python_file_ingest_tutorial_page Python Tutorial #1: Writing a File Ingest Module
+
+
+\section python_tutorial1_why Why Write a File Ingest Module?
+ Make a folder inside of there to store your module. Call it "DemoScript". Copy the fileIngestModule.py sample file listed above into the this new folder and rename it to FindBigRoundFiles.py. Your folder should look like this:
+
+\image html demoScript_folder.png
+
+\subsection python_tutorial1_writing Writing the Script
+
+We are going to write a script that flags any file that is larger than 10MB and whose size is a multiple of 4096. We’ll call these big and round files. This kind of technique could be useful for finding encrypted files. An additional check would be for entropy of the file, but we’ll keep the example simple.
+
+Open the FindBigRoundFiles.py file in your favorite python text editor. The sample Autopsy Python modules all have TODO entries in them to let you know what you should change. The below steps jump from one TODO to the next.
+
+
+
+\section python_tutorial1_ingest_modules Ingest Modules
+
+For our first example, we’re going to write an ingest module. Ingest modules in Autopsy run on the data sources that are added to a case. When you add a disk image (or local drive or logical folder) in Autopsy, you’ll be presented with a list of modules to run (such as hash lookup and keyword search).
+
+\image html ingest-modules.PNG
+
+Those are all ingest modules. We’re going to write one of those. There are two types of ingest modules that we can build:
+
+
+
+For this first tutorial, we’re going to write a file ingest module. The \ref mod_python_ds_ingest_tutorial_page "second tutorial" will focus on data source ingest modules. Regardless of the type of ingest module you are writing, you will need to work with two classes:
+
+
+
+\section python_tutorial1_getting_started Getting Started
+
+To write your first file ingest module, you’ll need:
+
+
+
+Some other general notes are that you will be writing in Jython, which converts Python-looking code into Java. It has some limitations, including:
+
+
+
+But, Jython will give you access to all of the Java classes and services that Autopsy provides. So, if you want to stray from this example, then refer to the Developer docs on what classes and methods you have access to. The comments in the sample file will identify what type of object is being passed in along with a URL to its documentation.
+
+\subsection python_tutorial1_folder Making Your Module Folder
+
+Every Python module in Autopsy gets its own folder. This reduces naming collisions between modules. To find out where you should put your Python module, launch Autopsy and choose the Tools -> Python Plugins menu item. That will open a folder in your AppData folder, such as "C:\Users\JDoe\AppData\Roaming\Autopsy\python_modules".
+
+
+
+
+\subsection python_tutorial1_process The process() Method
+
+The process() method is passed in a reference to an AbstractFile Object. With this, you have access to all of a file’s contents and metadata. We want to flag files that are larger than 10MB and that are a multiple of 4096 bytes. The following code does that:
+
+\verbatim if ((file.getSize() > 10485760) and ((file.getSize() % 4096) == 0)):
+\endverbatim
+
+Now that we have found the files, we want to do something with them. In our situation, we just want to alert the user to them. We do this by making an "Interesting Item" blackboard artifact. The Blackboard is where ingest modules can communicate with each other and with the Autopsy GUI. The blackboard has a set of artifacts on it and each artifact: