diff --git a/.gitignore b/.gitignore
index e91624b..37fd8ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-SOURCES/mdevctl-0.81.tar.gz
+SOURCES/mdevctl-1.1.0-vendor.tar.gz
+SOURCES/mdevctl-1.1.0.tar.gz
diff --git a/.mdevctl.metadata b/.mdevctl.metadata
index 42f0f91..88d5cc6 100644
--- a/.mdevctl.metadata
+++ b/.mdevctl.metadata
@@ -1 +1,2 @@
-31f9227e45d30cb9214e6683d7533d319a075d64 SOURCES/mdevctl-0.81.tar.gz
+3741595d871a00830c5b3c50f383eeda9f948469 SOURCES/mdevctl-1.1.0-vendor.tar.gz
+4bbd9e344db7324765572def56201d6fd6611057 SOURCES/mdevctl-1.1.0.tar.gz
diff --git a/SOURCES/0001-Report-root-error-when-a-callout-can-t-be-executed.patch b/SOURCES/0001-Report-root-error-when-a-callout-can-t-be-executed.patch
new file mode 100644
index 0000000..f0eb44f
--- /dev/null
+++ b/SOURCES/0001-Report-root-error-when-a-callout-can-t-be-executed.patch
@@ -0,0 +1,43 @@
+From ff69f6c64b14282172716d4e97b4b81da7606483 Mon Sep 17 00:00:00 2001
+From: Jonathon Jongsma <jjongsma@redhat.com>
+Date: Wed, 1 Dec 2021 16:37:36 -0600
+Subject: [PATCH 1/2] Report root error when a callout can't be executed
+
+We were ignoring the error result when a callout script failed to
+execute. In order to debug issues more easily, handle the error and
+print it to the debug output.
+
+Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
+---
+ src/callouts.rs | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/callouts.rs b/src/callouts.rs
+index 1c92d85..17b733b 100644
+--- a/src/callouts.rs
++++ b/src/callouts.rs
+@@ -240,8 +240,8 @@ impl Callout {
+         for s in dir.as_ref().read_dir().ok()? {
+             let path = s.ok()?.path();
+ 
+-            match self.invoke_script(dev, &path, event, action).ok() {
+-                Some(res) => {
++            match self.invoke_script(dev, &path, event, action) {
++                Ok(res) => {
+                     if res.status.code().is_none() {
+                         warn!("callout script {:?} was terminated by a signal", path);
+                         continue;
+@@ -255,8 +255,8 @@ impl Callout {
+                         );
+                     }
+                 }
+-                _ => {
+-                    debug!("failed to execute callout script {:?}", path);
++                Err(e) => {
++                    debug!("failed to execute callout script {:?}: {:?}", path, e);
+                     continue;
+                 }
+             }
+-- 
+2.33.1
+
diff --git a/SOURCES/0002-tests-read-stdin-in-callout-test-scripts.patch b/SOURCES/0002-tests-read-stdin-in-callout-test-scripts.patch
new file mode 100644
index 0000000..9cd616b
--- /dev/null
+++ b/SOURCES/0002-tests-read-stdin-in-callout-test-scripts.patch
@@ -0,0 +1,57 @@
+From 70ba0298a49ccffc085da051ad553a1242f0bfe1 Mon Sep 17 00:00:00 2001
+From: Jonathon Jongsma <jjongsma@redhat.com>
+Date: Wed, 1 Dec 2021 16:39:06 -0600
+Subject: [PATCH 2/2] tests: read stdin in callout test scripts
+
+Callout scripts are intended to be passed a JSON device configuration
+string on stdin. For our simple callout tests, we used single-line
+test scripts that unconditionally returned a constant response code
+(either error or success). This sometimes causes the tests to fail due
+to the following error:
+
+    [2021-12-01T20:33:25Z DEBUG mdevctl::callouts] failed to execute callout script "/tmp/mdevctl-testZg8CPd/etc/mdevctl.d/scripts.d/callouts/rc1.sh": Failed to write to stdin of command
+
+        Caused by:
+            Broken pipe (os error 32)
+
+What seems to be happening is that mdevctl spawns the callout script and
+then attempts to write the JSON device configuration to its stdin pipe.
+However, the test scripts are so short that they may have exited before
+mdevctl can finish writing to stdin, which results in the command
+failing with a broken pipe error. In order to avoid this, make sure that
+the test scripts read from stdin before exiting.
+
+Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
+---
+ tests/callouts/rc0.sh | 1 +
+ tests/callouts/rc1.sh | 1 +
+ tests/callouts/rc2.sh | 1 +
+ 3 files changed, 3 insertions(+)
+
+diff --git a/tests/callouts/rc0.sh b/tests/callouts/rc0.sh
+index 039e4d0..669d0ec 100755
+--- a/tests/callouts/rc0.sh
++++ b/tests/callouts/rc0.sh
+@@ -1,2 +1,3 @@
+ #!/usr/bin/env bash
++json=$(</dev/stdin)
+ exit 0
+diff --git a/tests/callouts/rc1.sh b/tests/callouts/rc1.sh
+index ecdbef9..3863171 100755
+--- a/tests/callouts/rc1.sh
++++ b/tests/callouts/rc1.sh
+@@ -1,2 +1,3 @@
+ #!/usr/bin/env bash
++json=$(</dev/stdin)
+ exit 1
+diff --git a/tests/callouts/rc2.sh b/tests/callouts/rc2.sh
+index 5c66540..f2ec274 100755
+--- a/tests/callouts/rc2.sh
++++ b/tests/callouts/rc2.sh
+@@ -1,2 +1,3 @@
+ #!/usr/bin/env bash
++json=$(</dev/stdin)
+ exit 2
+-- 
+2.33.1
+
diff --git a/SPECS/mdevctl.spec b/SPECS/mdevctl.spec
index 9149996..9497164 100644
--- a/SPECS/mdevctl.spec
+++ b/SPECS/mdevctl.spec
@@ -1,19 +1,26 @@
 Name:		mdevctl
-Version:	0.81
-Release:	1%{?dist}
+Version:	1.1.0
+Release:	2%{?dist}
 Summary:	Mediated device management and persistence utility
 
 Group:		System Environment/Kernel
 License:	LGPLv2
 URL:		https://github.com/mdevctl/mdevctl
-BuildArch:	noarch
 
 Source0:	https://github.com/mdevctl/mdevctl/archive/%{version}/%{name}-%{version}.tar.gz
+Source1:	https://github.com/mdevctl/mdevctl/archive/%{version}/%{name}-%{version}-vendor.tar.gz
 
+ExclusiveArch:  %{rust_arches}
+
+BuildRequires: bash
+BuildRequires: git
 BuildRequires: make
 BuildRequires: systemd
+BuildRequires: rust-toolset
 Requires(post,postun): %{_sbindir}/udevadm
-Requires: coreutils udev jq
+
+Patch0: 0001-Report-root-error-when-a-callout-can-t-be-executed.patch
+Patch1: 0002-tests-read-stdin-in-callout-test-scripts.patch
 
 %description
 mdevctl is a utility for managing and persisting devices in the
@@ -23,11 +30,19 @@ can be dynamically created and potentially used by drivers like
 vfio-mdev for assignment to virtual machines.
 
 %prep
-%setup -q -n %{name}-%{version}
+%autosetup -S git_am -n %{name}-%{version}
+%cargo_prep -V 1
+
+%build
+%cargo_build
 
 %install
 %make_install
 
+%check
+export MDEVCTL_LOG=debug RUST_BACKTRACE=full
+%cargo_test
+
 %files
 %license COPYING
 %doc README.md
@@ -35,10 +50,22 @@ vfio-mdev for assignment to virtual machines.
 %{_sbindir}/lsmdev
 %{_udevrulesdir}/60-mdevctl.rules
 %dir %{_sysconfdir}/mdevctl.d
+%dir %{_sysconfdir}/mdevctl.d/scripts.d/callouts
+%dir %{_sysconfdir}/mdevctl.d/scripts.d/notifiers
 %{_mandir}/man8/mdevctl.8*
 %{_mandir}/man8/lsmdev.8*
+%{_datadir}/bash-completion/completions/mdevctl
+%{_datadir}/bash-completion/completions/lsmdev
 
 %changelog
+* Wed Dec 01 2021 Eduardo Lima (Etrunko) <etrunko@redhat.com> - 1.1.0-2
+- Create additonal directories required by installation.
+- Fix sporadic callout test failures
+  Related: rhbz#1999687
+
+* Thu Nov 18 2021 Eduardo Lima (Etrunko) <etrunko@redhat.com> - 1.1.0-1
+- Rebase mdevctl to 1.1.0
+  Resolves: rhbz#1999687
 
 * Wed Jun 30 2021 Danilo de Paula <ddepaula@redhat.com> - 0.81-1
 - Rebase mdevctl to 0.81.1