diff --git a/lib/Site/Megaraid.pm b/lib/Site/Megaraid.pm
new file mode 100644
index 0000000000000000000000000000000000000000..77ad0e758816c890eef3229d8026987e8ce76e35
--- /dev/null
+++ b/lib/Site/Megaraid.pm
@@ -0,0 +1,133 @@
+package Site::Megaraid;
+
+use strict;
+use warnings;
+
+use base 'Resmon::Module';
+
+use Resmon::ExtComm qw(run_command cache_command);
+
+=pod
+
+=head1 NAME
+
+Site::Megaraid - pulls SMART values from disk drives
+
+=head1 SYNOPSIS
+
+ Site::Megaraid {
+     sda/2 : smartctl_cmd => /usr/sbin/smartctl
+ }
+
+=head1 DESCRIPTION
+
+Self-Monitoring, Analysis and Reporting Technology (SMART) allows for detecting
+errors and reporting on reliability indicators on hard disk drives.
+
+This module pulls the specified values from the output of the smartctl utility.
+For more information on smartctl, see http://smartmontools.sourceforge.net/
+
+=head1 CONFIGURATION
+
+=over
+
+=item check_name
+
+This indicates the disk argument to be given to smartctl.  Expects the basename
+of the device, not the full path, e.g. "sda" not "/dev/sda".
+
+=item smartctl_cmd
+
+The full path of the smartctl command.  Defaults to /usr/sbin/smartctl.
+
+=item smartctl_args
+
+Optional list of additional arguments that will be passed to smartctl.  
+The default arguments are "-i -A".  Any arguments specified here will be 
+added to this list.
+
+If the argument contains a comma, it must be escaped with a backslash.
+
+=back
+
+=head1 METRICS
+
+The SMART attribute data is highly vendor-specific.  Each attribute will produce
+two metrics, one with the normalized value and one with the raw value.
+
+Post-processing may be desirable in specific cases, such as when the value as
+hex has special meaning.
+
+=over
+
+=item model
+
+Device model as reported in the information section.
+
+=item serial
+
+Device serial number as reported in the information section.
+
+=item fw
+
+Device firmware version as reported in the information section.
+
+=item (attribute)
+
+The normalized value of the attribute, expected to be an integer.
+
+=item (attribute)_raw
+
+The raw value of the attribute, expected to be an integer.
+
+=back
+
+=cut
+
+sub handler {
+    my $self = shift;
+    my $config = $self->{config};
+    my ($disk_name,$megaraid_number) = split('/',$self->{check_name}),
+    my $disk;
+    $disk = "/dev/$disk_name" if ($^O eq "linux") || ($^O =~ /bsd/) ;
+    $disk = "/dev/rdsk/$disk_name" if $^O eq "solaris";
+    my $smartctl_cmd = $config->{smartctl_cmd} || "/usr/sbin/smartctl";
+    my $smartctl_args = "-i -a -H -d megaraid,$megaraid_number"; 
+    $smartctl_args = "$smartctl_args $config->{smartctl_args}" if $config->{smartctl_args};
+    my $smartdata = {};
+    print STDERR ("$smartctl_cmd $smartctl_args $disk\n");
+    my $output = run_command("$smartctl_cmd $smartctl_args $disk");
+
+    foreach my $line (split(/\n/, $output)) {
+        if ( ($line =~ /^Device Model:\s+(.+)$/)
+           ||($line =~ /^Product:\s+(.+)$/) )
+        {
+            $smartdata->{"model"} = [$1, "s"];
+        }
+        elsif ($line =~ /^Serial Number:\s+(.+)$/i) {
+            $smartdata->{"serial"} = [$1, "s"];
+        }
+        elsif ($line =~ /^SMART Health Status:\s+(.+)$/i) {
+            $smartdata->{"health"} = [$1, "s"];
+        }
+        elsif ( ($line =~ /^Firmware Version:\s+(.+)$/)
+              ||($line =~ /^Revision:\s+(.+)$/) )
+        {
+            $smartdata->{"firmware_version"} = [$1, "s"];
+        }
+        elsif ($line =~ /^Elements in grown defect list:\s+(.+)$/) {
+            $smartdata->{"elements_in_defect_list"} = [$1, "i"];
+        }
+        elsif ($line =~ /^(read|write|verify):\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(\d+)$/) {
+            print STDERR "$1 $1_errors_corrected $5 $1_errors_uncorrected $8\n";
+            $smartdata->{"$1_errors_corrected"} = [$5, "i"];
+            $smartdata->{"$1_errors_uncorrected"} = [$8, "i"];
+        }
+        elsif ($line =~ /^Non-medium error count:\s+(.+)$/) {
+            $smartdata->{"non_medium_errors"} = [$1, "i"];
+        }
+    }
+
+    return $smartdata;
+};
+1;