diff --git a/HISTORY.md b/HISTORY.md
index a400e404..372e1df3 100755
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -37,6 +37,7 @@
* fixed copying unattached comments among sprites, thanks, Jadga, for the report!
* disabled dropping reporters onto message hat block input slots
* fixed outdated blocks specs for "When I am ..." hat block in many translations
+ * fixed duplicating custom block definitions that don't have a body
* **Documentation Updates:**
* updated manual, thanks Brian!
* updated readme, thanks, Michael!
@@ -44,6 +45,9 @@
* German
* Chinese, thanks, Simon!
+### 2021-10-25
+* byob: fixed #2902
+
### 2021-10-22
* blocks, objects: only show the "message" upvar in the "When I receive" hat if "any message" is selected
* blocks: only show "key" upvar in the "When ... is pressed" hat if "any key" is selected
diff --git a/snap.html b/snap.html
index 362eda1d..1804f0ad 100755
--- a/snap.html
+++ b/snap.html
@@ -23,7 +23,7 @@
-
+
diff --git a/src/byob.js b/src/byob.js
index 296ddb91..6d9897ff 100644
--- a/src/byob.js
+++ b/src/byob.js
@@ -108,7 +108,7 @@ WatcherMorph, XML_Serializer, SnapTranslator, SnapExtensions*/
// Global stuff ////////////////////////////////////////////////////////
-modules.byob = '2021-October-14';
+modules.byob = '2021-October-25';
// Declarations
@@ -1287,7 +1287,7 @@ CustomCommandBlockMorph.prototype.duplicateBlockDefinition = function () {
def = this.isGlobal ? this.definition : rcvr.getMethod(this.blockSpec),
dup = def.copyAndBindTo(rcvr),
spec = dup.spec,
- exp = dup.body.expression,
+ exp = dup.body? dup.body.expression : null,
count = 1;
function rebindRecursiveCalls(topBlock) {