diff --git a/Build.PL b/Build.PL
index e62edfc..a69ee08 100644
--- a/Build.PL
+++ b/Build.PL
@@ -11,6 +11,7 @@
                      'gen_ipmi_sensor.pl',
                      'gen_led_groups.pl',
                      'gen_openpower_fru.pl',
+                     'gen_presence_yaml.pl',
                      'hwmon.pl'],
     pm_files => {'Inventory.pm' => 'lib/mrw/Inventory.pm',
                  'Util.pm' => 'lib/mrw/Util.pm'},
diff --git a/gen_presence_yaml.pl b/gen_presence_yaml.pl
new file mode 100755
index 0000000..96e323d
--- /dev/null
+++ b/gen_presence_yaml.pl
@@ -0,0 +1,132 @@
+#!/usr/bin/env perl
+
+#This script generates YAML that defines the presence detects used
+#for FRUs.  Its output is used by code that determines which FRUs
+#are present in a system.
+
+use strict;
+use warnings;
+
+use Getopt::Long;
+use mrw::Inventory;
+use mrw::Targets;
+use mrw::Util;
+
+my $serverwizFile;
+my $outputFile;
+GetOptions("i=s" => \$serverwizFile,
+           "o=s" => \$outputFile) or printUsage();
+
+if ((not defined $serverwizFile) ||
+    (not defined $outputFile))
+{
+    printUsage();
+}
+
+my $targets = Targets->new;
+$targets->loadXML($serverwizFile);
+
+my @inventory = Inventory::getInventory($targets);
+my %presence;
+
+findTachBasedPresenceDetects(\%presence);
+
+#Future: Find other sorts of presence detects
+
+printYAML(\%presence, $outputFile);
+
+exit 0;
+
+
+#Finds FRUs and their Presence detects where a tach reading
+#is used as the presence detect, such as when a nonzero fan RPM
+#tach reading can be used to tell that a particular fan is present.
+sub findTachBasedPresenceDetects
+{
+    my ($presence) = @_;
+    my %tachs;
+
+    for my $target (keys %{$targets->getAllTargets()})
+    {
+        my $connections = $targets->findConnections($target, "TACH");
+        next if ($connections eq "");
+
+        for my $tach (sort @{$connections->{CONN}})
+        {
+            #Because findConnections is recursive, we can hit this same
+            #connection multiple times so only use it once.
+            next if (exists $tachs{$tach->{SOURCE}}{$tach->{DEST}});
+            $tachs{$tach->{SOURCE}}{$tach->{DEST}} = 1;
+
+            my $fru = Util::getEnclosingFru($targets, $tach->{SOURCE});
+            my $name = Util::getObmcName(\@inventory, $fru);
+            if (not defined $name)
+            {
+                die "$target was not found in the inventory\n";
+            }
+
+            my $sensor = getSensor($tach->{DEST});
+
+            #For now, assuming only fans use tachs
+            $$presence{Tach}{$name}{type} = 'Fan';
+
+            #Multi-rotor fans will have > 1 sensors per FRU
+            push @{$$presence{Tach}{$name}{sensors}}, $sensor;
+        }
+    }
+}
+
+
+#Creates the YAML representation of the data
+sub printYAML
+{
+    my ($presence, $outputFile) = @_;
+    open (F, ">$outputFile") or die "Could not open $outputFile\n";
+
+    while (my ($method, $FRUs) = each(%{$presence}))
+    {
+        print F "- $method:\n";
+        while (my ($name, $data) = each(%{$FRUs}))
+        {
+            my ($prettyName) = $name =~ /\b(\w+)$/;
+
+            print F "  - PrettyName: $prettyName\n";
+            print F "    Inventory: $name\n";
+            print F "    Description:\n"; #purposely leaving blank.
+            print F "    Sensors:\n";
+            for my $s (@{$data->{sensors}})
+            {
+                print F "      - $s\n";
+            }
+        }
+    }
+
+    close F;
+}
+
+
+#Find what hwmon will call this unit's reading by looking in
+#the child unit-hwmon-feature unit.
+sub getSensor
+{
+    my ($unit) = @_;
+
+    my @hwmons = Util::getChildUnitsWithTargetType($targets,
+                                                   "unit-hwmon-feature",
+                                                   $unit);
+    die "No HWMON children found for $unit\n" unless (scalar @hwmons != 0);
+
+    my $name = $targets->getAttributeField($hwmons[0],
+                                           "HWMON_FEATURE",
+                                           "DESCRIPTIVE_NAME");
+    die "No HWMON name for hwmon unit $hwmons[0]\n" if ($name eq "");
+
+    return $name;
+}
+
+
+sub printUsage
+{
+    print "$0 -i [XML filename] -o [output YAML filename]\n";
+    exit(1);
+}
