diff --git a/circle/manager/scheduler.py b/circle/manager/scheduler.py
index f85e7bc..e75a5e6 100644
--- a/circle/manager/scheduler.py
+++ b/circle/manager/scheduler.py
@@ -50,9 +50,7 @@ def has_enough_ram(ram_size, node):
     """True, if the node has enough memory to accomodate a guest requiring
        ram_size mebibytes of memory; otherwise, false.
     """
-    total = node.ram_size
-    used = 512  # TODO replace mock value with data from monitor
-    unused = total - used
+    unused = node.ram_size * (1 - node.ram_usage)
 
     overcommit = node.ram_size_with_overcommit
     reserved = node.instance_set.aggregate(r=Sum('ram_size'))['r'] or 0
@@ -66,7 +64,7 @@ def free_cpu_time(node):
 
     Higher values indicate more idle time.
     """
-    activity = 0
+    activity = node.cpu_usage
     inactivity = 1 - activity
     cores = node.num_cores
-    return cores * inactivity  # TODO replace mock value with data from monitor
+    return cores * inactivity
diff --git a/circle/vm/models/node.py b/circle/vm/models/node.py
index 62e105c..2e507a2 100644
--- a/circle/vm/models/node.py
+++ b/circle/vm/models/node.py
@@ -163,11 +163,13 @@ class Node(TimeStampedModel):
             collected[metric] = cache
         return collected
 
+    @property
     def cpu_usage(self):
-        return self.get_monitor_info()["cpu.usage"]
+        return float(self.get_monitor_info()["cpu.usage"]) / 100
 
+    @property
     def ram_usage(self):
-        return self.get_monitor_info()["memory.usage"]
+        return float(self.get_monitor_info()["memory.usage"]) / 100
 
     def update_vm_states(self):
         domains = {}