diff --git a/sensors/host1_config.json b/sensors/host1_config.json
index 3f339c2..5f9d2e8 100644
--- a/sensors/host1_config.json
+++ b/sensors/host1_config.json
@@ -12,5 +12,8 @@
     },
     "perprocess-cpu": {
         "allowed_prefixes": ["ceph"]
+    },
+    "perprocess-ram": {
+        "allowed_prefixes": ["ceph"]
     }
 }
diff --git a/sensors/main.py b/sensors/main.py
index 7fc5ea7..4f0a8d1 100644
--- a/sensors/main.py
+++ b/sensors/main.py
@@ -11,6 +11,7 @@
 import syscpu_sensors
 import sysram_sensors
 import pscpu_sensors
+import psram_sensors
 
 from utils import SensorInfo
 from daemonize import Daemonize
diff --git a/sensors/ps_mem.py b/sensors/ps_mem.py
new file mode 100644
index 0000000..f98e5c3
--- /dev/null
+++ b/sensors/ps_mem.py
@@ -0,0 +1,497 @@
+#!/usr/bin/env python
+
+# Try to determine how much RAM is currently being used per program.
+# Note per _program_, not per process. So for example this script
+# will report RAM used by all httpd process together. In detail it reports:
+# sum(private RAM for program processes) + sum(Shared RAM for program processes)
+# The shared RAM is problematic to calculate, and this script automatically
+# selects the most accurate method available for your kernel.
+
+# Licence: LGPLv2
+# Author:  P@draigBrady.com
+# Source:  http://www.pixelbeat.org/scripts/ps_mem.py
+
+# V1.0      06 Jul 2005     Initial release
+# V1.1      11 Aug 2006     root permission required for accuracy
+# V1.2      08 Nov 2006     Add total to output
+#                           Use KiB,MiB,... for units rather than K,M,...
+# V1.3      22 Nov 2006     Ignore shared col from /proc/$pid/statm for
+#                           2.6 kernels up to and including 2.6.9.
+#                           There it represented the total file backed extent
+# V1.4      23 Nov 2006     Remove total from output as it's meaningless
+#                           (the shared values overlap with other programs).
+#                           Display the shared column. This extra info is
+#                           useful, especially as it overlaps between programs.
+# V1.5      26 Mar 2007     Remove redundant recursion from human()
+# V1.6      05 Jun 2007     Also report number of processes with a given name.
+#                           Patch from riccardo.murri@gmail.com
+# V1.7      20 Sep 2007     Use PSS from /proc/$pid/smaps if available, which
+#                           fixes some over-estimation and allows totalling.
+#                           Enumerate the PIDs directly rather than using ps,
+#                           which fixes the possible race between reading
+#                           RSS with ps, and shared memory with this program.
+#                           Also we can show non truncated command names.
+# V1.8      28 Sep 2007     More accurate matching for stats in /proc/$pid/smaps
+#                           as otherwise could match libraries causing a crash.
+#                           Patch from patrice.bouchand.fedora@gmail.com
+# V1.9      20 Feb 2008     Fix invalid values reported when PSS is available.
+#                           Reported by Andrey Borzenkov <arvidjaar@mail.ru>
+# V3.3      24 Jun 2014
+#   http://github.com/pixelb/scripts/commits/master/scripts/ps_mem.py
+
+# Notes:
+#
+# All interpreted programs where the interpreter is started
+# by the shell or with env, will be merged to the interpreter
+# (as that's what's given to exec). For e.g. all python programs
+# starting with "#!/usr/bin/env python" will be grouped under python.
+# You can change this by using the full command line but that will
+# have the undesirable affect of splitting up programs started with
+# differing parameters (for e.g. mingetty tty[1-6]).
+#
+# For 2.6 kernels up to and including 2.6.13 and later 2.4 redhat kernels
+# (rmap vm without smaps) it can not be accurately determined how many pages
+# are shared between processes in general or within a program in our case:
+# http://lkml.org/lkml/2005/7/6/250
+# A warning is printed if overestimation is possible.
+# In addition for 2.6 kernels up to 2.6.9 inclusive, the shared
+# value in /proc/$pid/statm is the total file-backed extent of a process.
+# We ignore that, introducing more overestimation, again printing a warning.
+# Since kernel 2.6.23-rc8-mm1 PSS is available in smaps, which allows
+# us to calculate a more accurate value for the total RAM used by programs.
+#
+# Programs that use CLONE_VM without CLONE_THREAD are discounted by assuming
+# they're the only programs that have the same /proc/$PID/smaps file for
+# each instance.  This will fail if there are multiple real instances of a
+# program that then use CLONE_VM without CLONE_THREAD, or if a clone changes
+# its memory map while we're checksumming each /proc/$PID/smaps.
+#
+# I don't take account of memory allocated for a program
+# by other programs. For e.g. memory used in the X server for
+# a program could be determined, but is not.
+#
+# FreeBSD is supported if linprocfs is mounted at /compat/linux/proc/
+# FreeBSD 8.0 supports up to a level of Linux 2.6.16
+
+import getopt
+import time
+import errno
+import os
+import sys
+
+try:
+    # md5 module is deprecated on python 2.6
+    # so try the newer hashlib first
+    import hashlib
+    md5_new = hashlib.md5
+except ImportError:
+    import md5
+    md5_new = md5.new
+
+
+# The following exits cleanly on Ctrl-C or EPIPE
+# while treating other exceptions as before.
+def std_exceptions(etype, value, tb):
+    sys.excepthook = sys.__excepthook__
+    if issubclass(etype, KeyboardInterrupt):
+        pass
+    elif issubclass(etype, IOError) and value.errno == errno.EPIPE:
+        pass
+    else:
+        sys.__excepthook__(etype, value, tb)
+sys.excepthook = std_exceptions
+
+#
+#   Define some global variables
+#
+
+PAGESIZE = os.sysconf("SC_PAGE_SIZE") / 1024 #KiB
+our_pid = os.getpid()
+
+have_pss = 0
+
+class Proc:
+    def __init__(self):
+        uname = os.uname()
+        if uname[0] == "FreeBSD":
+            self.proc = '/compat/linux/proc'
+        else:
+            self.proc = '/proc'
+
+    def path(self, *args):
+        return os.path.join(self.proc, *(str(a) for a in args))
+
+    def open(self, *args):
+        try:
+            return open(self.path(*args))
+        except (IOError, OSError):
+            val = sys.exc_info()[1]
+            if (val.errno == errno.ENOENT or # kernel thread or process gone
+                val.errno == errno.EPERM):
+                raise LookupError
+            raise
+
+proc = Proc()
+
+
+#
+#   Functions
+#
+
+def parse_options():
+    try:
+        long_options = ['split-args', 'help', 'total']
+        opts, args = getopt.getopt(sys.argv[1:], "shtp:w:", long_options)
+    except getopt.GetoptError:
+        sys.stderr.write(help())
+        sys.exit(3)
+
+    if len(args):
+        sys.stderr.write("Extraneous arguments: %s\n" % args)
+        sys.exit(3)
+
+    # ps_mem.py options
+    split_args = False
+    pids_to_show = None
+    watch = None
+    only_total = False
+
+    for o, a in opts:
+        if o in ('-s', '--split-args'):
+            split_args = True
+        if o in ('-t', '--total'):
+            only_total = True
+        if o in ('-h', '--help'):
+            sys.stdout.write(help())
+            sys.exit(0)
+        if o in ('-p',):
+            try:
+                pids_to_show = [int(x) for x in a.split(',')]
+            except:
+                sys.stderr.write(help())
+                sys.exit(3)
+        if o in ('-w',):
+            try:
+                watch = int(a)
+            except:
+                sys.stderr.write(help())
+                sys.exit(3)
+
+    return (split_args, pids_to_show, watch, only_total)
+
+def help():
+    help_msg = 'Usage: ps_mem [OPTION]...\n' \
+    'Show program core memory usage\n' \
+    '\n' \
+    '  -h, -help                   Show this help\n' \
+    '  -p <pid>[,pid2,...pidN]     Only show memory usage PIDs in the specified list\n' \
+    '  -s, --split-args            Show and separate by, all command line arguments\n' \
+    '  -t, --total                 Show only the total value\n' \
+    '  -w <N>                      Measure and show process memory every N seconds\n'
+
+    return help_msg
+
+#(major,minor,release)
+def kernel_ver():
+    kv = proc.open('sys/kernel/osrelease').readline().split(".")[:3]
+    last = len(kv)
+    if last == 2:
+        kv.append('0')
+    last -= 1
+    while last > 0:
+        for char in "-_":
+            kv[last] = kv[last].split(char)[0]
+        try:
+            int(kv[last])
+        except:
+            kv[last] = 0
+        last -= 1
+    return (int(kv[0]), int(kv[1]), int(kv[2]))
+
+
+#return Private,Shared
+#Note shared is always a subset of rss (trs is not always)
+def getMemStats(pid):
+    global have_pss
+    mem_id = pid #unique
+    Private_lines = []
+    Shared_lines = []
+    Pss_lines = []
+    Rss = (int(proc.open(pid, 'statm').readline().split()[1])
+           * PAGESIZE)
+    if os.path.exists(proc.path(pid, 'smaps')): #stat
+        digester = md5_new()
+        for line in proc.open(pid, 'smaps').readlines(): #open
+            # Note we checksum smaps as maps is usually but
+            # not always different for separate processes.
+            digester.update(line.encode('latin1'))
+            if line.startswith("Shared"):
+                Shared_lines.append(line)
+            elif line.startswith("Private"):
+                Private_lines.append(line)
+            elif line.startswith("Pss"):
+                have_pss = 1
+                Pss_lines.append(line)
+        mem_id = digester.hexdigest()
+        Shared = sum([int(line.split()[1]) for line in Shared_lines])
+        Private = sum([int(line.split()[1]) for line in Private_lines])
+        #Note Shared + Private = Rss above
+        #The Rss in smaps includes video card mem etc.
+        if have_pss:
+            pss_adjust = 0.5 # add 0.5KiB as this avg error due to trunctation
+            Pss = sum([float(line.split()[1])+pss_adjust for line in Pss_lines])
+            Shared = Pss - Private
+    elif (2,6,1) <= kernel_ver() <= (2,6,9):
+        Shared = 0 #lots of overestimation, but what can we do?
+        Private = Rss
+    else:
+        Shared = int(proc.open(pid, 'statm').readline().split()[2])
+        Shared *= PAGESIZE
+        Private = Rss - Shared
+    return (Private, Shared, mem_id)
+
+
+def getCmdName(pid, split_args):
+    cmdline = proc.open(pid, 'cmdline').read().split("\0")
+    if cmdline[-1] == '' and len(cmdline) > 1:
+        cmdline = cmdline[:-1]
+
+    path = proc.path(pid, 'exe')
+    try:
+        path = os.readlink(path)
+        # Some symlink targets were seen to contain NULs on RHEL 5 at least
+        # https://github.com/pixelb/scripts/pull/10, so take string up to NUL
+        path = path.split('\0')[0]
+    except OSError:
+        val = sys.exc_info()[1]
+        if (val.errno == errno.ENOENT or # either kernel thread or process gone
+            val.errno == errno.EPERM):
+            raise LookupError
+        raise
+
+    if split_args:
+        return " ".join(cmdline)
+    if path.endswith(" (deleted)"):
+        path = path[:-10]
+        if os.path.exists(path):
+            path += " [updated]"
+        else:
+            #The path could be have prelink stuff so try cmdline
+            #which might have the full path present. This helped for:
+            #/usr/libexec/notification-area-applet.#prelink#.fX7LCT (deleted)
+            if os.path.exists(cmdline[0]):
+                path = cmdline[0] + " [updated]"
+            else:
+                path += " [deleted]"
+    exe = os.path.basename(path)
+    cmd = proc.open(pid, 'status').readline()[6:-1]
+    if exe.startswith(cmd):
+        cmd = exe #show non truncated version
+        #Note because we show the non truncated name
+        #one can have separated programs as follows:
+        #584.0 KiB +   1.0 MiB =   1.6 MiB    mozilla-thunder (exe -> bash)
+        # 56.0 MiB +  22.2 MiB =  78.2 MiB    mozilla-thunderbird-bin
+    return cmd
+
+
+#The following matches "du -h" output
+#see also human.py
+def human(num, power="Ki", units=None):
+    if units is None:
+        powers = ["Ki", "Mi", "Gi", "Ti"]
+        while num >= 1000: #4 digits
+            num /= 1024.0
+            power = powers[powers.index(power)+1]
+        return "%.1f %sB" % (num, power)
+    else:
+        return "%.f" % ((num * 1024) / units)
+
+
+def cmd_with_count(cmd, count):
+    if count > 1:
+        return "%s (%u)" % (cmd, count)
+    else:
+        return cmd
+
+#Warn of possible inaccuracies
+#2 = accurate & can total
+#1 = accurate only considering each process in isolation
+#0 = some shared mem not reported
+#-1= all shared mem not reported
+def shared_val_accuracy():
+    """http://wiki.apache.org/spamassassin/TopSharedMemoryBug"""
+    kv = kernel_ver()
+    pid = os.getpid()
+    if kv[:2] == (2,4):
+        if proc.open('meminfo').read().find("Inact_") == -1:
+            return 1
+        return 0
+    elif kv[:2] == (2,6):
+        if os.path.exists(proc.path(pid, 'smaps')):
+            if proc.open(pid, 'smaps').read().find("Pss:")!=-1:
+                return 2
+            else:
+                return 1
+        if (2,6,1) <= kv <= (2,6,9):
+            return -1
+        return 0
+    elif kv[0] > 2 and os.path.exists(proc.path(pid, 'smaps')):
+        return 2
+    else:
+        return 1
+
+def show_shared_val_accuracy( possible_inacc, only_total=False ):
+    level = ("Warning","Error")[only_total]
+    if possible_inacc == -1:
+        sys.stderr.write(
+         "%s: Shared memory is not reported by this system.\n" % level
+        )
+        sys.stderr.write(
+         "Values reported will be too large, and totals are not reported\n"
+        )
+    elif possible_inacc == 0:
+        sys.stderr.write(
+         "%s: Shared memory is not reported accurately by this system.\n" % level
+        )
+        sys.stderr.write(
+         "Values reported could be too large, and totals are not reported\n"
+        )
+    elif possible_inacc == 1:
+        sys.stderr.write(
+         "%s: Shared memory is slightly over-estimated by this system\n"
+         "for each program, so totals are not reported.\n" % level
+        )
+    sys.stderr.close()
+    if only_total and possible_inacc != 2:
+        sys.exit(1)
+
+def get_memory_usage( pids_to_show, split_args, include_self=False, only_self=False ):
+    cmds = {}
+    shareds = {}
+    mem_ids = {}
+    count = {}
+    for pid in os.listdir(proc.path('')):
+        if not pid.isdigit():
+            continue
+        pid = int(pid)
+
+        # Some filters
+        if only_self and pid != our_pid:
+            continue
+        if pid == our_pid and not include_self:
+            continue
+        if pids_to_show is not None and pid not in pids_to_show:
+            continue
+
+        try:
+            cmd = getCmdName(pid, split_args)
+        except LookupError:
+            #operation not permitted
+            #kernel threads don't have exe links or
+            #process gone
+            continue
+
+        try:
+            private, shared, mem_id = getMemStats(pid)
+        except RuntimeError:
+            continue #process gone
+        if shareds.get(cmd):
+            if have_pss: #add shared portion of PSS together
+                shareds[cmd] += shared
+            elif shareds[cmd] < shared: #just take largest shared val
+                shareds[cmd] = shared
+        else:
+            shareds[cmd] = shared
+        cmds[cmd] = cmds.setdefault(cmd, 0) + private
+        if cmd in count:
+            count[cmd] += 1
+        else:
+            count[cmd] = 1
+        mem_ids.setdefault(cmd, {}).update({mem_id:None})
+
+    #Add shared mem for each program
+    total = 0
+    for cmd in cmds:
+        cmd_count = count[cmd]
+        if len(mem_ids[cmd]) == 1 and cmd_count > 1:
+            # Assume this program is using CLONE_VM without CLONE_THREAD
+            # so only account for one of the processes
+            cmds[cmd] /= cmd_count
+            if have_pss:
+                shareds[cmd] /= cmd_count
+        cmds[cmd] = cmds[cmd] + shareds[cmd]
+        total += cmds[cmd] #valid if PSS available
+
+    sorted_cmds = sorted(cmds.items(), key=lambda x:x[1])
+    sorted_cmds = [x for x in sorted_cmds if x[1]]
+
+    return sorted_cmds, shareds, count, total
+
+def print_header():
+    sys.stdout.write(" Private  +   Shared  =  RAM used\tProgram\n\n")
+
+def print_memory_usage(sorted_cmds, shareds, count, total):
+    for cmd in sorted_cmds:
+        sys.stdout.write("%9s + %9s = %9s\t%s\n" %
+                         (human(cmd[1]-shareds[cmd[0]]),
+                          human(shareds[cmd[0]]), human(cmd[1]),
+                          cmd_with_count(cmd[0], count[cmd[0]])))
+    if have_pss:
+        sys.stdout.write("%s\n%s%9s\n%s\n" %
+                         ("-" * 33, " " * 24, human(total), "=" * 33))
+
+def verify_environment():
+    if os.geteuid() != 0:
+        sys.stderr.write("Sorry, root permission required.\n")
+        if __name__ == '__main__':
+            sys.stderr.close()
+            sys.exit(1)
+
+    try:
+        kv = kernel_ver()
+    except (IOError, OSError):
+        val = sys.exc_info()[1]
+        if val.errno == errno.ENOENT:
+            sys.stderr.write(
+              "Couldn't access " + proc.path('') + "\n"
+              "Only GNU/Linux and FreeBSD (with linprocfs) are supported\n")
+            sys.exit(2)
+        else:
+            raise
+
+if __name__ == '__main__':
+    split_args, pids_to_show, watch, only_total = parse_options()
+    verify_environment()
+
+    if not only_total:
+        print_header()
+
+    if watch is not None:
+        try:
+            sorted_cmds = True
+            while sorted_cmds:
+                sorted_cmds, shareds, count, total = get_memory_usage( pids_to_show, split_args )
+                if only_total and have_pss:
+                    sys.stdout.write(human(total, units=1)+'\n')
+                elif not only_total:
+                    print_memory_usage(sorted_cmds, shareds, count, total)
+                time.sleep(watch)
+            else:
+                sys.stdout.write('Process does not exist anymore.\n')
+        except KeyboardInterrupt:
+            pass
+    else:
+        # This is the default behavior
+        sorted_cmds, shareds, count, total = get_memory_usage( pids_to_show, split_args )
+        if only_total and have_pss:
+            sys.stdout.write(human(total, units=1)+'\n')
+        elif not only_total:
+            print_memory_usage(sorted_cmds, shareds, count, total)
+
+    # We must close explicitly, so that any EPIPE exception
+    # is handled by our excepthook, rather than the default
+    # one which is reenabled after this script finishes.
+    sys.stdout.close()
+
+    vm_accuracy = shared_val_accuracy()
+    show_shared_val_accuracy( vm_accuracy, only_total )
diff --git a/sensors/psram_sensors.py b/sensors/psram_sensors.py
new file mode 100644
index 0000000..74bc65e
--- /dev/null
+++ b/sensors/psram_sensors.py
@@ -0,0 +1,44 @@
+import os
+import time
+
+from ps_mem import getMemStats
+
+from discover import provides
+from utils import SensorInfo, get_pid_name, get_pid_list
+
+
+
+@provides("perprocess-ram")
+def psram_stat(disallowed_prefixes=None, allowed_prefixes=None):
+    results = {}
+    pid_list = get_pid_list(disallowed_prefixes, allowed_prefixes)
+    print pid_list
+    for pid in pid_list:
+        try:
+            dev_name = get_pid_name(pid)
+
+            private, shared, _ = getMemStats(pid)
+            total = private + shared
+            sys_total = get_ram_size()
+            usage = float(total) / float(sys_total)
+
+            sensor_name = "{0}.{1}".format(dev_name, pid)
+
+            results[sensor_name + ".private_mem"] = SensorInfo(private, False)
+            results[sensor_name + ".shared_mem"] = SensorInfo(shared, False)
+            results[sensor_name + ".used_mem"] = SensorInfo(total, False)
+            results[sensor_name + ".mem_usage_percent"] = SensorInfo(usage*100, False)
+        except IOError:
+            # permission denied or proc die
+            continue
+    return results
+
+
+def get_ram_size():
+    """ Return RAM size in Kb"""
+    with open("/proc/meminfo") as proc:
+        mem_total = proc.readline().split()
+        return mem_total[1]
+
+if __name__ == '__main__':
+    print psram_stat(allowed_prefixes=["skype"])
diff --git a/sensors/utils.py b/sensors/utils.py
index e4f45b1..546dee7 100644
--- a/sensors/utils.py
+++ b/sensors/utils.py
@@ -35,6 +35,7 @@
                 name = get_pid_name(pid)
                 if pid in allowed_prefixes or \
                    any(name.startswith(val) for val in allowed_prefixes):
+                    print name
                     # this is allowed pid?
                     result.append(pid)
     return result
