diff --git a/ndn/experiments/psync/__init__.py b/ndn/experiments/psync/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ndn/experiments/psync/__init__.py
diff --git a/ndn/experiments/psync/psync-full.py b/ndn/experiments/psync/psync-full.py
new file mode 100644
index 0000000..206993e
--- /dev/null
+++ b/ndn/experiments/psync/psync-full.py
@@ -0,0 +1,75 @@
+# -*- Mode:python; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+#
+# Copyright (C) 2015-2019, The University of Memphis,
+#                          Arizona Board of Regents,
+#                          Regents of the University of California.
+#
+# This file is part of Mini-NDN.
+# See AUTHORS.md for a complete list of Mini-NDN authors and contributors.
+#
+# Mini-NDN is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Mini-NDN is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Mini-NDN, e.g., in COPYING.md file.
+# If not, see <http://www.gnu.org/licenses/>.
+
+from ndn.experiments.experiment import Experiment
+from ndn.apps.nfdc import Nfdc
+
+import time
+import sys
+
+class PSyncFull(Experiment):
+
+    def __init__(self, args):
+        Experiment.__init__(self, args)
+        self.syncPrefix = "/sync"
+        self.numUserPrefixesPerNode = 2
+        self.maxUpdatesPerUserPrefixPerNode = 3
+
+    def registerRouteToAllNeighbors(self, host):
+        for node in self.net.hosts:
+            for neighbor in node.connectionsTo(host):
+                ip = node.IP(neighbor[0])
+                Nfdc.createFace(host, ip)
+                Nfdc.registerRoute(host, self.syncPrefix, ip)
+
+    def start(self):
+        for host in self.net.hosts:
+            Nfdc.setStrategy(host, self.syncPrefix, "multicast")
+            self.registerRouteToAllNeighbors(host)
+
+        print("Starting psync-full-sync on all the nodes")
+        for host in self.net.hosts:
+            host.cmd("export NDN_LOG=examples.FullSyncApp=INFO")
+            host.cmd("psync-full-sync {} {} {} {} &> psync.logs &"
+                     .format(self.syncPrefix, host.name, self.numUserPrefixesPerNode,
+                             self.maxUpdatesPerUserPrefixPerNode))
+
+        print("Sleeping 5 minutes for convergence")
+        # Estimated time for 4 node default topology
+        time.sleep(300)
+
+        totalUpdates = int(host.cmd("grep -r Update {}/*/psync.logs | wc -l"
+                                    .format(self.options.workDir)))
+
+        expectedUpdates = (self.maxUpdatesPerUserPrefixPerNode *
+                          len(self.net.hosts) * (len(self.net.hosts) - 1) *
+                          self.numUserPrefixesPerNode)
+
+        if totalUpdates == expectedUpdates:
+            print("PSync full sync has successfully converged.")
+        else:
+            print("PSync full sync convergence was not successful. Exiting...")
+            self.net.stop()
+            sys.exit(1)
+
+Experiment.register("psync-full", PSyncFull)
diff --git a/ndn/experiments/psync/psync-partial.py b/ndn/experiments/psync/psync-partial.py
new file mode 100644
index 0000000..9b37281
--- /dev/null
+++ b/ndn/experiments/psync/psync-partial.py
@@ -0,0 +1,59 @@
+# -*- Mode:python; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
+#
+# Copyright (C) 2015-2019, The University of Memphis,
+#                          Arizona Board of Regents,
+#                          Regents of the University of California.
+#
+# This file is part of Mini-NDN.
+# See AUTHORS.md for a complete list of Mini-NDN authors and contributors.
+#
+# Mini-NDN is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Mini-NDN is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Mini-NDN, e.g., in COPYING.md file.
+# If not, see <http://www.gnu.org/licenses/>.
+
+from ndn.experiments.experiment import Experiment
+from ndn.apps.nfdc import Nfdc
+
+import time
+import sys
+
+class PSyncPartial(Experiment):
+
+    def __init__(self, args):
+        Experiment.__init__(self, args)
+
+    def start(self):
+        host1 = self.net.hosts[0]
+
+        host1.cmd("export NDN_LOG=examples.PartialSyncProducerApp=INFO")
+        host1.cmd("psync-producer /sync /{} 10 1 &> producer.log &".format(host1.name))
+        time.sleep(1)
+
+        host1.cmd("export NDN_LOG=examples.PartialSyncConsumerApp=INFO:$NDN_LOG")
+        host1.cmd("psync-consumer /sync 5 &> consumer.log &")
+
+        print("Sleeping 90 seconds for convergence")
+        time.sleep(90)
+
+        consumerSubs = int(host1.cmd("cat consumer.log | grep -c Subscribing"))
+        consumerUpdates = int(host1.cmd("cat consumer.log | grep -c Update"))
+        producerPublish = int(host1.cmd("cat producer.log | grep -c Publish"))
+
+        if consumerSubs == 5 and consumerUpdates == 5 and producerPublish == 10:
+            print("PSync partial sync has successfully converged.")
+        else:
+            print("PSync partial sync convergence was not successful. Exiting...")
+            self.net.stop()
+            sys.exit(1)
+
+Experiment.register("psync-partial", PSyncPartial)
