diff --git a/docs/DZ Mainnet-beta Connection.md b/docs/DZ Mainnet-beta Connection.md
index 942f68a..5f356a8 100644
--- a/docs/DZ Mainnet-beta Connection.md	
+++ b/docs/DZ Mainnet-beta Connection.md	
@@ -334,6 +334,6 @@ default via 149.28.38.1 dev enp1s0 proto dhcp src 149.28.38.64 metric 100
 
 </div>
 
-### Up Next: Multicast
+### Up Next: Publishing Shreds via Multicast
 
-If you have completed this setup and plan to use Multicast, proceed to the [next page](Multicast%20Connection.md).
+If you have completed this setup and plan publishing shreds via multicast, proceed to the [next page](DoubleZero%20Validator%20Multicast.md).
diff --git a/docs/DZ Testnet Connection.md b/docs/DZ Testnet Connection.md
index 77afa83..add1401 100644
--- a/docs/DZ Testnet Connection.md	
+++ b/docs/DZ Testnet Connection.md	
@@ -384,6 +384,6 @@ default via 149.28.38.1 dev enp1s0 proto dhcp src 149.28.38.64 metric 100
 
 </div>
 
-### Up Next: Multicast
+### Up Next: Publishing Shreds via Multicast
 
-If you have completed this setup and plan to use Multicast, proceed to the [next page](Multicast%20Connection.md).
+If you have completed this setup and plan publishing shreds via multicast, proceed to the [next page](DoubleZero%20Validator%20Multicast.md).
diff --git a/docs/DoubleZero Validator Multicast.md b/docs/DoubleZero Validator Multicast.md
new file mode 100644
index 0000000..ca890d8
--- /dev/null
+++ b/docs/DoubleZero Validator Multicast.md	
@@ -0,0 +1,47 @@
+# DoubleZero Validator Multicast
+!!! warning "By connecting to DoubleZero I agree to the [DoubleZero Terms of Service](https://doublezero.xyz/terms-protocol)"
+
+
+
+
+### Publishing shreds to bebop (validators)
+
+After following [setup](setup.md), and the relevant [testnet](DZ%20Testnet%20Connection.md) or [mainnet-beta](DZ%20Mainnet-beta%20Connection.md) validator connection documentation you may publish shreds to the DoubleZero multicast group. Validators can publish shreds to the **bebop** multicast group. The multicast destination is `233.84.178.1:7733`. Configure your validator client as follows:
+
+#### Jito Agave (version x.x.x or higher)
+
+1. Connect to the DoubleZero multicast group bebop as a publisher:
+   `doublezero connect multicast --publish bebop`
+2. In your validator start script, add:
+   `--shred-receiver-address 233.84.178.1:7733`
+3. Restart your validator.
+
+#### Frankendancer
+
+1. Connect to the DoubleZero multicast group bebop as a publisher:
+   `doublezero connect multicast --publish bebop`
+2. In `config.toml`, add:
+   ```toml
+   [tiles.shred]
+   additional_shred_destinations_leader = [ "233.84.178.1:7733", ]
+   ```
+3. Restart your validator.
+
+#### Confirm you are publishing
+
+During your next leader slot, confirm you are publishing to the multicast group, use tcpdump during your next leader slot. You should see a heartbeat every 30 seconds.
+
+Run: `sudo tcpdump -c5 -ni doublezero1 port 7733 or port 4096 or port 5765 -vv`
+
+Example output when publishing:
+
+```
+tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
+listening on doublezero1, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
+23:13:37.189797 IP 147.51.126.79.8015 > 233.84.178.1.7733: UDP, length 1203
+23:13:37.189816 IP 147.51.126.79.8015 > 233.84.178.1.7733: UDP, length 1203
+...
+5 packets captured
+64 packets received by filter
+0 packets dropped by kernel
+```
diff --git a/docs/Multicast Connection.md b/docs/Multicast Connection.md
index 40c44f1..96eaf36 100644
--- a/docs/Multicast Connection.md	
+++ b/docs/Multicast Connection.md	
@@ -1,13 +1,10 @@
-# Multicast Connections
+# Other Multicast
 !!! warning "By connecting to DoubleZero I agree to the [DoubleZero Terms of Service](https://doublezero.xyz/terms-protocol)"
-
-The DoubleZero Network supports public and private Multicast services. Using Multicast, data published from one source can be efficiently distributed to multiple consumers (subscribers). Publishers do not need to send individual streams to each subscriber. Multicast is a capability which is not available on the Internet.  
+ 
 
 |Use Case | First Step | When Approve, connect via:| 
 |---------|------------|---------------------------| 
 |Subscribe to Jito Shredstream | Contact Jito for approval. | ```doublezero connect multicast --subscribe jito-shredstream``` |
-|Publish to a Private Service | If you'd like to publish to a private service, please contact the DZ Foundation here. When approved, you connect via | ```doublezero connect multicast --publish <feed name>``` [optional additional feed names space separated] |
-|Subscribe to a Private Service	| If you'd like to subscribe to a private service, please contact the owner of that Service or fill in this form to be directed. | ```doublezero connect multicast --subscribe <feed name>``` [optional additional feed names space separated] |
 
 Detailed connection information: 
 
@@ -70,4 +67,4 @@ doublezero user list --client-ip <your ip>
 
 |account                                      | user_type | groups | device    | location    | cyoa_type  | client_ip       | dz_ip       | accesspass     | tunnel_id | tunnel_net       | status    | owner |
 |----|----|----|----|----|----|----|----|----|----|----|----|----|
-|wQWmt7L6mTyszhyLywJeTk85KJhe8BGW4oCcmxbhaxJ  | Multicast | P:mg02 | ams-dz001 | Amsterdam   | GREOverDIA | 137.174.145.145 | 198.18.0.1  | Prepaid: (MAX) | 515       | 169.254.3.58/31  | activated | DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan|
+|wQWmt7L6mTyszhyLywJeTk85KJhe8BGW4oCcmxbhaxJ  | Multicast | P:mg02 | ams-dz001 | Amsterdam   | GREOverDIA | 137.174.145.145 | 198.18.0.1  | Prepaid: (MAX) | 515       | 169.254.3.58/31  | activated | DZfHfcCXTLwgZeCRKQ1FL1UuwAwFAZM93g86NMYpfYan|
\ No newline at end of file
diff --git a/docs/ValidatorShredPublishing.md b/docs/ValidatorShredPublishing.md
new file mode 100644
index 0000000..c8ced18
--- /dev/null
+++ b/docs/ValidatorShredPublishing.md
@@ -0,0 +1,44 @@
+# DoubleZero Validator Multicast
+!!! warning "By connecting to DoubleZero I agree to the [DoubleZero Terms of Service](https://doublezero.xyz/terms-protocol)"
+
+### Publishing shreds to bebop (validators)
+
+After following [setup](setup.md), and the relevant [testnet](DZ%20Testnet%20Connection.md) or [mainnet-beta](DZ%20Mainnet-beta%20Connection.md) validator connection documentation you may publish shreds to the DoubleZero multicast group. Validators can publish shreds to the **bebop** multicast group. The multicast destination is `233.84.178.1:7733`. Configure your validator client as follows:
+
+#### Jito Agave (version x.x.x or higher)
+
+1. Connect to the DoubleZero multicast group bebop as a publisher:
+   `doublezero connect multicast --publish bebop`
+2. In your validator start script, add:
+   `--shred-receiver-address 233.84.178.1:7733`
+3. Restart your validator.
+
+#### Frankendancer
+
+1. Connect to the DoubleZero multicast group bebop as a publisher:
+   `doublezero connect multicast --publish bebop`
+2. In `config.toml`, add:
+   ```toml
+   [tiles.shred]
+   additional_shred_destinations_leader = [ "233.84.178.1:7733", ]
+   ```
+3. Restart your validator.
+
+#### Confirm you are publishing
+
+During your next leader slot, confirm you are publishing to the multicast group, use tcpdump during your next leader slot. You should see a heartbeat every 30 seconds.
+
+Run: `sudo tcpdump -c5 -ni doublezero1 port 7733 or port 4096 or port 5765 -vv`
+
+Example output when publishing:
+
+```
+tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
+listening on doublezero1, link-type LINUX_SLL (Linux cooked v1), snapshot length 262144 bytes
+23:13:37.189797 IP 147.51.126.79.8015 > 233.84.178.1.7733: UDP, length 1203
+23:13:37.189816 IP 147.51.126.79.8015 > 233.84.178.1.7733: UDP, length 1203
+...
+5 packets captured
+64 packets received by filter
+0 packets dropped by kernel
+```
diff --git a/docs/javascripts/page-toolbar.js b/docs/javascripts/page-toolbar.js
index 98da183..a025608 100644
--- a/docs/javascripts/page-toolbar.js
+++ b/docs/javascripts/page-toolbar.js
@@ -1,23 +1,11 @@
-// Page toolbar functionality for documentation pages
-// Adds toolbar with Copy Page, View Markdown, Ask in ChatGPT, and Ask in Claude
+// Page toolbar: Copy Page, View Markdown, Ask in ChatGPT, Ask in Claude (all pages)
 (function() {
   'use strict';
 
-  // Check if we're on the setup page
-  function isSetupPage() {
-    // Check if current page path includes 'setup'
-    var path = window.location.pathname;
-    // Handle various URL formats: /setup/, /setup, /setup.html, /users/setup/, etc.
-    var normalizedPath = path.replace(/\/$/, '').replace(/\.html$/, '').toLowerCase();
-    return normalizedPath.endsWith('/setup') || normalizedPath.endsWith('setup') || 
-           normalizedPath === '/setup' || normalizedPath === 'setup';
-  }
-
-  // Create the toolbar HTML
   function createToolbar() {
     var toolbar = document.createElement('div');
     toolbar.className = 'page-toolbar';
-    toolbar.innerHTML = 
+    toolbar.innerHTML =
       '<a href="#" class="page-toolbar-link" id="copy-page-btn">' +
         '<img src="data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'16\' height=\'16\' viewBox=\'0 0 24 24\' fill=\'none\' stroke=\'%23ffffff\' stroke-width=\'2\' stroke-linecap=\'round\' stroke-linejoin=\'round\'%3E%3Crect x=\'9\' y=\'9\' width=\'13\' height=\'13\' rx=\'2\' ry=\'2\'%3E%3C/rect%3E%3Cpath d=\'M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\'%3E%3C/path%3E%3C/svg%3E" class="page-toolbar-icon" alt="" />' +
         'Copy Page' +
@@ -40,171 +28,79 @@
     return toolbar;
   }
 
-  // Get page content as text
   function getPageContent() {
     var content = document.querySelector('.md-content__inner');
-    if (!content) {
-      content = document.querySelector('main');
-    }
-    if (!content) {
-      content = document.body;
-    }
+    if (!content) content = document.querySelector('main');
+    if (!content) content = document.body;
     return content ? content.innerText || content.textContent : '';
   }
 
-  // Get page title
   function getPageTitle() {
     var title = document.querySelector('h1');
     return title ? title.textContent.trim() : document.title;
   }
 
-  // Copy page content to clipboard
   function copyPageToClipboard() {
-    var content = getPageContent();
-    var title = getPageTitle();
-    var textToCopy = title + '\n\n' + content;
-    
+    var textToCopy = getPageTitle() + '\n\n' + getPageContent();
     if (navigator.clipboard && navigator.clipboard.writeText) {
       navigator.clipboard.writeText(textToCopy).then(function() {
         showCopyFeedback('copy-page-btn');
-      }).catch(function(err) {
-        console.error('Failed to copy:', err);
-        fallbackCopy(textToCopy);
-      });
-    } else {
-      fallbackCopy(textToCopy);
-    }
+      }).catch(function() { fallbackCopy(textToCopy); });
+    } else { fallbackCopy(textToCopy); }
   }
 
-  // Fallback copy method for older browsers
   function fallbackCopy(text) {
-    var textArea = document.createElement('textarea');
-    textArea.value = text;
-    textArea.style.position = 'fixed';
-    textArea.style.left = '-999999px';
-    document.body.appendChild(textArea);
-    textArea.select();
-    try {
-      document.execCommand('copy');
-      showCopyFeedback('copy-page-btn');
-    } catch (err) {
-      console.error('Fallback copy failed:', err);
-    }
-    document.body.removeChild(textArea);
+    var ta = document.createElement('textarea');
+    ta.value = text;
+    ta.style.position = 'fixed';
+    ta.style.left = '-999999px';
+    document.body.appendChild(ta);
+    ta.select();
+    try { document.execCommand('copy'); showCopyFeedback('copy-page-btn'); } catch (e) {}
+    document.body.removeChild(ta);
   }
 
-  // Show copy feedback
   function showCopyFeedback(buttonId) {
     var btn = document.getElementById(buttonId);
     if (btn) {
-      var icon = btn.querySelector('.page-toolbar-icon');
-      var textNode = Array.from(btn.childNodes).find(function(node) {
-        return node.nodeType === 3 && node.textContent.trim();
-      });
-      if (textNode) {
-        var originalText = textNode.textContent.trim();
-        textNode.textContent = 'Copied!';
-        btn.classList.add('copied');
-        setTimeout(function() {
-          textNode.textContent = originalText;
-          btn.classList.remove('copied');
-        }, 2000);
-      }
+      var originalText = btn.textContent;
+      btn.textContent = 'Copied!';
+      btn.classList.add('copied');
+      setTimeout(function() { btn.textContent = originalText; btn.classList.remove('copied'); }, 2000);
     }
   }
 
-  // View markdown source
   function viewMarkdown() {
-    // Get the current page path
-    var path = window.location.pathname;
-    // Remove leading/trailing slashes and .html extension
-    path = path.replace(/^\/|\/$/g, '').replace(/\.html$/, '');
-    
-    // Default to setup.md if path is empty or just 'setup'
-    if (!path || path === 'setup') {
-      path = 'setup';
-    }
-    
-    // Construct GitHub raw URL
-    // Repository: malbeclabs/docs
-    var repoOwner = 'malbeclabs';
-    var repoName = 'docs';
-    var branch = 'main';
-    
-    // Try to construct GitHub raw URL
-    var markdownUrl = 'https://raw.githubusercontent.com/' + repoOwner + '/' + repoName + '/' + branch + '/docs/' + path + '.md';
-    
-    // Open in new tab
+    var path = window.location.pathname.replace(/^\/|\/$/g, '').replace(/\.html$/, '') || 'index';
+    var markdownUrl = 'https://raw.githubusercontent.com/malbeclabs/docs/main/docs/' + path + '.md';
     window.open(markdownUrl, '_blank');
   }
 
-  // Ask in ChatGPT
   function askInChatGPT() {
-    var content = getPageContent();
-    var title = getPageTitle();
-    var prompt = 'I\'m reading this documentation page: "' + title + '"\n\n' + content.substring(0, 3000) + (content.length > 3000 ? '...' : '');
-    var url = 'https://chat.openai.com/?q=' + encodeURIComponent(prompt);
-    window.open(url, '_blank');
+    var prompt = 'I\'m reading this documentation page: "' + getPageTitle() + '"\n\n' + getPageContent().substring(0, 3000) + (getPageContent().length > 3000 ? '...' : '');
+    window.open('https://chat.openai.com/?q=' + encodeURIComponent(prompt), '_blank');
   }
 
-  // Ask in Claude
   function askInClaude() {
-    var content = getPageContent();
-    var title = getPageTitle();
-    var prompt = 'I\'m reading this documentation page: "' + title + '"\n\n' + content.substring(0, 3000) + (content.length > 3000 ? '...' : '');
-    var url = 'https://claude.ai/new?prompt=' + encodeURIComponent(prompt);
-    window.open(url, '_blank');
+    var prompt = 'I\'m reading this documentation page: "' + getPageTitle() + '"\n\n' + getPageContent().substring(0, 3000) + (getPageContent().length > 3000 ? '...' : '');
+    window.open('https://claude.ai/new?prompt=' + encodeURIComponent(prompt), '_blank');
   }
 
-  // Initialize toolbar
-  function initToolbar() {
-    // Only add toolbar on setup page
-    if (!isSetupPage()) {
-      return;
-    }
-
-    // Wait for page to be ready
-    if (document.readyState === 'loading') {
-      document.addEventListener('DOMContentLoaded', function() {
-        addToolbar();
-      });
-    } else {
-      addToolbar();
-    }
-  }
-
-  // Add toolbar to page
   function addToolbar() {
-    // Create a fixed footer at the bottom of the screen
     var footer = document.createElement('footer');
     footer.className = 'page-toolbar-footer';
-    
-    // Create and insert toolbar
-    var toolbar = createToolbar();
-    footer.appendChild(toolbar);
-    
-    // Insert at the end of body
+    footer.appendChild(createToolbar());
     document.body.appendChild(footer);
 
-    // Attach event listeners
-    document.getElementById('copy-page-btn').addEventListener('click', function(e) {
-      e.preventDefault();
-      copyPageToClipboard();
-    });
-    document.getElementById('view-markdown-btn').addEventListener('click', function(e) {
-      e.preventDefault();
-      viewMarkdown();
-    });
-    document.getElementById('ask-chatgpt-btn').addEventListener('click', function(e) {
-      e.preventDefault();
-      askInChatGPT();
-    });
-    document.getElementById('ask-claude-btn').addEventListener('click', function(e) {
-      e.preventDefault();
-      askInClaude();
-    });
+    document.getElementById('copy-page-btn').addEventListener('click', function(e) { e.preventDefault(); copyPageToClipboard(); });
+    document.getElementById('view-markdown-btn').addEventListener('click', function(e) { e.preventDefault(); viewMarkdown(); });
+    document.getElementById('ask-chatgpt-btn').addEventListener('click', function(e) { e.preventDefault(); askInChatGPT(); });
+    document.getElementById('ask-claude-btn').addEventListener('click', function(e) { e.preventDefault(); askInClaude(); });
   }
 
-  // Initialize when script loads
-  initToolbar();
+  if (document.readyState === 'loading') {
+    document.addEventListener('DOMContentLoaded', addToolbar);
+  } else {
+    addToolbar();
+  }
 })();
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 23284e3..22f3a6f 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -1,71 +1,71 @@
-:root  > * {
-    --md-accent-fg-color:        #16B5F4;
-  }
+ :root  > * {
+      --md-accent-fg-color:        #16B5F4;
+    }
 
-/* Page toolbar styles - text-based links like Pyth docs */
-.page-toolbar-footer {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  background: var(--md-default-bg-color, #1e1e1e);
-  border-top: 1px solid rgba(255, 255, 255, 0.1);
-  z-index: 100;
-  padding: 0;
-}
+  /* Page toolbar styles - text-based links like Pyth docs */
+  .page-toolbar-footer {
+    position: fixed;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    background: var(--md-default-bg-color, #1e1e1e);
+    border-top: 1px solid rgba(255, 255, 255, 0.1);
+    z-index: 100;
+    padding: 0;
+  }
 
-.page-toolbar {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  gap: 0.5rem;
-  padding: 0.75rem 1rem;
-  font-size: 0.875rem;
-  color: #ffffff;
-  max-width: 100%;
-  margin: 0 auto;
-}
+  .page-toolbar {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 0.5rem;
+    padding: 0.75rem 1rem;
+    font-size: 0.875rem;
+    color: #ffffff;
+    max-width: 100%;
+    margin: 0 auto;
+  }
 
-.page-toolbar-link {
-  display: inline-flex;
-  align-items: center;
-  gap: 0.375rem;
-  color: #ffffff;
-  text-decoration: none;
-  cursor: pointer;
-  transition: opacity 0.2s ease;
-}
+  .page-toolbar-link {
+    display: inline-flex;
+    align-items: center;
+    gap: 0.375rem;
+    color: #ffffff;
+    text-decoration: none;
+    cursor: pointer;
+    transition: opacity 0.2s ease;
+  }
 
-.page-toolbar-link:hover {
-  text-decoration: underline;
-  opacity: 0.8;
-}
+  .page-toolbar-link:hover {
+    text-decoration: underline;
+    opacity: 0.8;
+  }
 
-.page-toolbar-link.copied {
-  color: #ffffff;
-  font-weight: 500;
-}
+  .page-toolbar-link.copied {
+    color: #ffffff;
+    font-weight: 500;
+  }
 
-.page-toolbar-icon {
-  width: 16px;
-  height: 16px;
-  flex-shrink: 0;
-  vertical-align: middle;
-  opacity: 0.9;
-}
+  .page-toolbar-icon {
+    width: 16px;
+    height: 16px;
+    flex-shrink: 0;
+    vertical-align: middle;
+    opacity: 0.9;
+  }
 
-.page-toolbar-favicon {
-  filter: brightness(0) invert(1);
-}
+  .page-toolbar-favicon {
+    filter: brightness(0) invert(1);
+  }
 
-.page-toolbar-separator {
-  color: rgba(255, 255, 255, 0.5);
-  user-select: none;
-}
+  .page-toolbar-separator {
+    color: rgba(255, 255, 255, 0.5);
+    user-select: none;
+  }
 
-/* Responsive design for smaller screens */
-@media screen and (max-width: 768px) {
-  .page-toolbar {
-    flex-wrap: wrap;
+  /* Responsive design for smaller screens */
+  @media screen and (max-width: 768px) {
+    .page-toolbar {
+      flex-wrap: wrap;
+    }
   }
-}
\ No newline at end of file
diff --git a/mkdocs.yml b/mkdocs.yml
index 4db1fd1..9ffb64b 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -24,7 +24,8 @@ nav:
         - Validator Mainnet-Beta Connection: DZ Mainnet-beta Connection.md
         - Validator Testnet Connection: DZ Testnet Connection.md
         - Permissioned Connection: Permissioned Connection.md
-        - Multicast Connection: Multicast Connection.md
+        - DoubleZero Validator Multicast: DoubleZero Validator Multicast.md
+        - Other Multicast: Multicast Connection.md
         - Paying Fees: paying-fees.md
         - Paying Fees with 2Z: paying-fees2z.md
         - Troubleshooting: troubleshooting.md
@@ -61,6 +62,7 @@ extra_css:
 extra_javascript:
   - javascripts/cloudsmith-versions.js
   - javascripts/connection-wizard.js
+  - javascripts/page-toolbar.js
   - javascripts/mathjax.js
   - path: https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
   - javascripts/page-toolbar.js
