diff --git a/beat/core/protocoltemplate.py b/beat/core/protocoltemplate.py
index 11574f56ce556c944fd57238b466cd84c4c80aa4..7b932c12500dcca9de9719c4c3e8573a6cf6a493 100644
--- a/beat/core/protocoltemplate.py
+++ b/beat/core/protocoltemplate.py
@@ -48,6 +48,7 @@ Forward importing from :py:mod:`beat.backend.python.protocoltemplate`:
 import six
 
 from . import schema
+from . import prototypes
 
 from beat.backend.python.protocoltemplate import Storage
 from beat.backend.python.protocoltemplate import (
@@ -106,18 +107,22 @@ class ProtocolTemplate(BackendProtocolTemplate):
         self.storage = None
         self.dataformats = {}  # preloaded dataformats
 
-        if isinstance(data, six.string_types):  # user has passed a file pointer
-
-            self._name = data
-            self.storage = Storage(self.prefix, self._name)
-            data = self.storage.json.path
-            if not self.storage.json.exists():
-                self.errors.append(
-                    "Protocol template declaration file not found: %s" % data
-                )
-                return
-
-        # this runs basic validation, including JSON loading if required
-        self.data, self.errors = schema.validate("protocoltemplate", data)
-        if self.errors:
-            return  # don't proceed with the rest of validation
+        if data is None:  # loads prototype and validates it
+            self.data, self.errors = prototypes.load("protocoltemplate")
+            assert not self.errors, "\n  * %s" % "\n  *".join(self.errors)  # nosec
+        else:
+            if isinstance(data, six.string_types):  # user has passed a file pointer
+
+                self._name = data
+                self.storage = Storage(self.prefix, self._name)
+                data = self.storage.json.path
+                if not self.storage.json.exists():
+                    self.errors.append(
+                        "Protocol template declaration file not found: %s" % data
+                    )
+                    return
+
+            # this runs basic validation, including JSON loading if required
+            self.data, self.errors = schema.validate("protocoltemplate", data)
+            if self.errors:
+                return  # don't proceed with the rest of validation
diff --git a/beat/core/prototypes/protocoltemplate.json b/beat/core/prototypes/protocoltemplate.json
new file mode 100644
index 0000000000000000000000000000000000000000..81cd94cd12dc2eb2b0414f7c855cb9229e591d0a
--- /dev/null
+++ b/beat/core/prototypes/protocoltemplate.json
@@ -0,0 +1,11 @@
+{
+    "schema_version": 1,
+    "sets": [
+        {
+            "name": "name",
+            "outputs": {
+                "out": "user/single_integer/1"
+            }
+        }
+    ]
+}
diff --git a/beat/core/test/test_protocoltemplate.py b/beat/core/test/test_protocoltemplate.py
index 526a85602e81f87e821c765d666bda27b9686684..dfc9c6fe7757a476022b08be7e48a9d8985cef25 100644
--- a/beat/core/test/test_protocoltemplate.py
+++ b/beat/core/test/test_protocoltemplate.py
@@ -41,6 +41,12 @@ from . import prefix, tmp_prefix
 from .utils import cleanup
 
 
+def test_default():
+
+    obj = ProtocolTemplate(prefix, data=None)
+    nose.tools.assert_true(obj.valid, "\n  * %s" % "\n  * ".join(obj.errors))
+
+
 def test_export():
     for protocol_name in [
         "double",