diff --git a/ui/core/app/components/copy-button/index.hbs b/ui/core/app/components/copy-button/index.hbs
new file mode 100644
index 000000000..fb5c4b157
--- /dev/null
+++ b/ui/core/app/components/copy-button/index.hbs
@@ -0,0 +1 @@
+{{yield}}
\ No newline at end of file
diff --git a/ui/core/app/components/copy-button/index.js b/ui/core/app/components/copy-button/index.js
new file mode 100644
index 000000000..1e32d2663
--- /dev/null
+++ b/ui/core/app/components/copy-button/index.js
@@ -0,0 +1,4 @@
+import Component from '@glimmer/component';
+
+export default class CopyButtonComponent extends Component {
+}
diff --git a/ui/core/tests/integration/components/copy-button-test.js b/ui/core/tests/integration/components/copy-button-test.js
new file mode 100644
index 000000000..428596788
--- /dev/null
+++ b/ui/core/tests/integration/components/copy-button-test.js
@@ -0,0 +1,26 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'ember-qunit';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Component | copy-button', function(hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function(assert) {
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.set('myAction', function(val) { ... });
+
+ await render(hbs``);
+
+ assert.equal(this.element.textContent.trim(), '');
+
+ // Template block usage:
+ await render(hbs`
+
+ template block text
+
+ `);
+
+ assert.equal(this.element.textContent.trim(), 'template block text');
+ });
+});