diff --git a/lib/Core/Linux/Cpu.pm b/lib/Core/Linux/Cpu.pm
new file mode 100644
index 0000000000000000000000000000000000000000..ef27f92bf035ad8f308f5aeab1ad58fae5575f58
--- /dev/null
+++ b/lib/Core/Linux/Cpu.pm
@@ -0,0 +1,125 @@
+package Core::Linux::Cpu;
+
+use strict;
+use warnings;
+
+use base 'Resmon::Module';
+
+use Resmon::ExtComm qw(run_command cache_command);
+
+=pod
+
+=head1 NAME
+
+Core::Sample - a sample/template resmon module
+
+=head1 SYNOPSIS
+
+ Core::Linux::Cpu {
+    cpu: noop
+ }
+
+ Core::Linux::Cpu {
+     cpu: multi => 1
+ }
+
+=head1 DESCRIPTION
+
+This module monitors CPU usage for Linux. It supports per-CPU statistics, as
+well as showing a combined total. The combined total will never go above 100%.
+
+=head1 CONFIGURATION
+
+=over
+
+=item check_name
+
+The check name is descriptive only in this check. It is not used for anything.
+
+=item multi
+
+Show statistics for all CPUs/Cores as well as a combined total. If set to 0,
+then only show a combined total.
+
+=back
+
+=head1 METRICS
+
+=over
+
+=item cpu_* (user, nice, system, idle, iowait, irq, softirq)
+
+The CPU usage for all CPUs combined. E.g. cpu_user == normal user processes
+for all cpus combined. The usage is a percentage of all cpu usage combined.
+
+
+=item cpu1_* (user, nice, system, idle, iowait, irq, softirq)
+
+Individual CPU stats. The stats are a percentage of total cpu usage for that
+CPU.
+
+=back
+
+=cut
+
+sub get_new_values {
+    my $config = shift;
+    open (my $fh, "<" , "/proc/stat");
+    my @cols = ("user", "nice", "system", "idle", "iowait", "irq", "softirq",
+        "steal", "guest");
+    my $values = {};
+    while (<$fh>) {
+        if (/^cpu/) {
+            my @parts = split;
+
+            my $cpu = shift @parts;
+
+            if ((defined($config->{multi}) && $config->{multi} == 1) ||
+                $cpu eq 'cpu') {
+                $values->{$cpu} = {};
+                for (my $i=0; $i<@cols && $i<@parts; $i++) {
+                    $values->{$cpu}->{$cols[$i]} = $parts[$i];
+                }
+            }
+
+        }
+    }
+    return $values;
+}
+
+sub handler {
+    my $self = shift;
+    my $config = $self->{config}; # All configuration is in here
+
+    my $values = get_new_values($config);
+    if (!defined($self->{cached_values})) {
+        # It's the first run, we need to wait a second and get some new cpu
+        # values os we can compare the two. For subsequent runs, we can just
+        # use the values from the previous run and take the difference between
+        # the two.
+        $self->{cached_values} = $values;
+        sleep(1);
+        $values = get_new_values($config);
+    }
+
+    my $total_delta = {}; # Total ticks for calculating percentage
+    for my $cpu (keys %$values) {
+        $total_delta->{$cpu} = 0;
+        for my $i (keys %{$values->{$cpu}}) {
+            $total_delta->{$cpu} += (
+                $values->{$cpu}->{$i} - $self->{cached_values}->{$cpu}->{$i});
+        }
+    };
+
+    my $metrics = {};
+    while (my ($cpu, $percpu_values) = each %$values) {
+        while (my ($name, $value) = each %$percpu_values) {
+            my $delta = $value - $self->{cached_values}->{$cpu}->{$name};
+            $metrics->{"${cpu}_$name"} = [
+                sprintf("%.2f", (100 * $delta / $total_delta->{$cpu})), "n"];
+        }
+    }
+    return $metrics;
+};
+
+1;