diff --git a/src/sdeventplus/event.cpp b/src/sdeventplus/event.cpp
index f65750e..96d4190 100644
--- a/src/sdeventplus/event.cpp
+++ b/src/sdeventplus/event.cpp
@@ -54,6 +54,50 @@
     return sdevent;
 }
 
+int Event::prepare() const
+{
+    int r = sdevent->sd_event_prepare(event.get());
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_prepare");
+    }
+    return r;
+}
+
+int Event::wait(MaybeTimeout timeout) const
+{
+    // An unsigned -1 timeout value means infinity in sd_event
+    uint64_t timeout_usec = timeout ? timeout->count() : -1;
+    int r = sdevent->sd_event_wait(event.get(), timeout_usec);
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_wait");
+    }
+    return r;
+}
+
+int Event::dispatch() const
+{
+    int r = sdevent->sd_event_dispatch(event.get());
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_dispatch");
+    }
+    return r;
+}
+
+int Event::run(MaybeTimeout timeout) const
+{
+    // An unsigned -1 timeout value means infinity in sd_event
+    uint64_t timeout_usec = timeout ? timeout->count() : -1;
+    int r = sdevent->sd_event_run(event.get(), timeout_usec);
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_run");
+    }
+    return r;
+}
+
 int Event::loop() const
 {
     int r = sdevent->sd_event_loop(event.get());
@@ -64,6 +108,27 @@
     return r;
 }
 
+int Event::exit(int code) const
+{
+    int r = sdevent->sd_event_exit(event.get(), code);
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_exit");
+    }
+    return r;
+}
+
+int Event::get_exit_code() const
+{
+    int code;
+    int r = sdevent->sd_event_get_exit_code(event.get(), &code);
+    if (r < 0)
+    {
+        throw SdEventError(-r, "sd_event_get_exit_code");
+    }
+    return code;
+}
+
 int Event::get_watchdog() const
 {
     int r = sdevent->sd_event_get_watchdog(event.get());
diff --git a/src/sdeventplus/event.hpp b/src/sdeventplus/event.hpp
index b979cfc..b8ffb97 100644
--- a/src/sdeventplus/event.hpp
+++ b/src/sdeventplus/event.hpp
@@ -1,7 +1,9 @@
 #pragma once
 
+#include <experimental/optional>
 #include <sdeventplus/internal/sdevent.hpp>
 #include <sdeventplus/internal/sdref.hpp>
+#include <sdeventplus/internal/utils.hpp>
 #include <systemd/sd-event.h>
 
 namespace sdeventplus
@@ -10,6 +12,9 @@
 class Event
 {
   public:
+    using Timeout = SdEventDuration;
+    using MaybeTimeout = std::experimental::optional<Timeout>;
+
     Event(sd_event* event,
           const internal::SdEvent* sdevent = &internal::sdevent_impl);
     Event(sd_event* event, std::false_type,
@@ -23,7 +28,14 @@
     sd_event* get() const;
     const internal::SdEvent* getSdEvent() const;
 
+    int prepare() const;
+    int wait(MaybeTimeout timeout) const;
+    int dispatch() const;
+    int run(MaybeTimeout timeout) const;
     int loop() const;
+    int exit(int code) const;
+
+    int get_exit_code() const;
     int get_watchdog() const;
     int set_watchdog(int b) const;
 
diff --git a/src/sdeventplus/internal/sdevent.hpp b/src/sdeventplus/internal/sdevent.hpp
index 4baff05..be8e0a8 100644
--- a/src/sdeventplus/internal/sdevent.hpp
+++ b/src/sdeventplus/internal/sdevent.hpp
@@ -17,11 +17,17 @@
     virtual sd_event* sd_event_ref(sd_event* event) const = 0;
     virtual sd_event* sd_event_unref(sd_event* event) const = 0;
 
+    virtual int sd_event_prepare(sd_event* event) const = 0;
+    virtual int sd_event_wait(sd_event* event, uint64_t usec) const = 0;
+    virtual int sd_event_dispatch(sd_event* event) const = 0;
+    virtual int sd_event_run(sd_event* event, uint64_t usec) const = 0;
     virtual int sd_event_loop(sd_event* event) const = 0;
+    virtual int sd_event_exit(sd_event* event, int code) const = 0;
 
     virtual int sd_event_now(sd_event* event, clockid_t clock,
                              uint64_t* usec) const = 0;
 
+    virtual int sd_event_get_exit_code(sd_event* event, int* code) const = 0;
     virtual int sd_event_get_watchdog(sd_event* event) const = 0;
     virtual int sd_event_set_watchdog(sd_event* event, int b) const = 0;
 
@@ -73,17 +79,47 @@
         return ::sd_event_unref(event);
     }
 
+    int sd_event_prepare(sd_event* event) const override
+    {
+        return ::sd_event_prepare(event);
+    }
+
+    int sd_event_wait(sd_event* event, uint64_t usec) const override
+    {
+        return ::sd_event_wait(event, usec);
+    }
+
+    int sd_event_dispatch(sd_event* event) const override
+    {
+        return ::sd_event_dispatch(event);
+    }
+
+    int sd_event_run(sd_event* event, uint64_t usec) const override
+    {
+        return ::sd_event_run(event, usec);
+    }
+
     int sd_event_loop(sd_event* event) const override
     {
         return ::sd_event_loop(event);
     }
 
+    int sd_event_exit(sd_event* event, int code) const override
+    {
+        return ::sd_event_exit(event, code);
+    }
+
     int sd_event_now(sd_event* event, clockid_t clock,
                      uint64_t* usec) const override
     {
         return ::sd_event_now(event, clock, usec);
     }
 
+    int sd_event_get_exit_code(sd_event* event, int* code) const override
+    {
+        return ::sd_event_get_exit_code(event, code);
+    }
+
     int sd_event_get_watchdog(sd_event* event) const override
     {
         return ::sd_event_get_watchdog(event);
diff --git a/src/sdeventplus/test/sdevent.hpp b/src/sdeventplus/test/sdevent.hpp
index 5f0e400..fd05b30 100644
--- a/src/sdeventplus/test/sdevent.hpp
+++ b/src/sdeventplus/test/sdevent.hpp
@@ -17,10 +17,16 @@
     MOCK_CONST_METHOD1(sd_event_ref, sd_event*(sd_event*));
     MOCK_CONST_METHOD1(sd_event_unref, sd_event*(sd_event*));
 
+    MOCK_CONST_METHOD1(sd_event_prepare, int(sd_event*));
+    MOCK_CONST_METHOD2(sd_event_wait, int(sd_event*, uint64_t));
+    MOCK_CONST_METHOD1(sd_event_dispatch, int(sd_event*));
+    MOCK_CONST_METHOD2(sd_event_run, int(sd_event*, uint64_t));
     MOCK_CONST_METHOD1(sd_event_loop, int(sd_event*));
+    MOCK_CONST_METHOD2(sd_event_exit, int(sd_event*, int));
 
     MOCK_CONST_METHOD3(sd_event_now, int(sd_event*, clockid_t, uint64_t*));
 
+    MOCK_CONST_METHOD2(sd_event_get_exit_code, int(sd_event*, int*));
     MOCK_CONST_METHOD1(sd_event_get_watchdog, int(sd_event*));
     MOCK_CONST_METHOD2(sd_event_set_watchdog, int(sd_event*, int b));
 
diff --git a/test/event.cpp b/test/event.cpp
index 7149ac4..f5547ae 100644
--- a/test/event.cpp
+++ b/test/event.cpp
@@ -94,6 +94,94 @@
     }
 };
 
+TEST_F(EventMethodTest, PrepareSuccessNone)
+{
+    EXPECT_CALL(mock, sd_event_prepare(expected_event)).WillOnce(Return(0));
+    EXPECT_EQ(0, event->prepare());
+}
+
+TEST_F(EventMethodTest, PrepareSuccessReady)
+{
+    const int events_ready = 10;
+    EXPECT_CALL(mock, sd_event_prepare(expected_event))
+        .WillOnce(Return(events_ready));
+    EXPECT_EQ(events_ready, event->prepare());
+}
+
+TEST_F(EventMethodTest, PrepareInternalError)
+{
+    EXPECT_CALL(mock, sd_event_prepare(expected_event))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->prepare(), SdEventError);
+}
+
+TEST_F(EventMethodTest, WaitSuccessNone)
+{
+    const std::chrono::microseconds timeout{20};
+    EXPECT_CALL(mock, sd_event_wait(expected_event, timeout.count()))
+        .WillOnce(Return(0));
+    EXPECT_EQ(0, event->wait(timeout));
+}
+
+TEST_F(EventMethodTest, WaitSuccessReady)
+{
+    const int events_ready = 10;
+    EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
+        .WillOnce(Return(events_ready));
+    EXPECT_EQ(events_ready, event->wait(std::experimental::nullopt));
+}
+
+TEST_F(EventMethodTest, WaitInternalError)
+{
+    EXPECT_CALL(mock, sd_event_wait(expected_event, static_cast<uint64_t>(-1)))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->wait(std::experimental::nullopt), SdEventError);
+}
+
+TEST_F(EventMethodTest, DispatchInitial)
+{
+    EXPECT_CALL(mock, sd_event_dispatch(expected_event)).WillOnce(Return(0));
+    EXPECT_EQ(0, event->dispatch());
+}
+
+TEST_F(EventMethodTest, DispatchDone)
+{
+    const int done_code = 10;
+    EXPECT_CALL(mock, sd_event_dispatch(expected_event))
+        .WillOnce(Return(done_code));
+    EXPECT_EQ(done_code, event->dispatch());
+}
+
+TEST_F(EventMethodTest, DispatchInternalError)
+{
+    EXPECT_CALL(mock, sd_event_dispatch(expected_event))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->dispatch(), SdEventError);
+}
+
+TEST_F(EventMethodTest, RunSuccessNone)
+{
+    const std::chrono::microseconds timeout{20};
+    EXPECT_CALL(mock, sd_event_run(expected_event, timeout.count()))
+        .WillOnce(Return(0));
+    EXPECT_EQ(0, event->run(timeout));
+}
+
+TEST_F(EventMethodTest, RunSuccessReady)
+{
+    const int events_ready = 10;
+    EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
+        .WillOnce(Return(events_ready));
+    EXPECT_EQ(events_ready, event->run(std::experimental::nullopt));
+}
+
+TEST_F(EventMethodTest, RunInternalError)
+{
+    EXPECT_CALL(mock, sd_event_run(expected_event, static_cast<uint64_t>(-1)))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->run(std::experimental::nullopt), SdEventError);
+}
+
 TEST_F(EventMethodTest, LoopSuccess)
 {
     EXPECT_CALL(mock, sd_event_loop(expected_event)).WillOnce(Return(0));
@@ -114,6 +202,45 @@
     EXPECT_THROW(event->loop(), SdEventError);
 }
 
+TEST_F(EventMethodTest, ExitSuccess)
+{
+    EXPECT_CALL(mock, sd_event_exit(expected_event, 0)).WillOnce(Return(2));
+    EXPECT_EQ(2, event->exit(0));
+}
+
+TEST_F(EventMethodTest, ExitUserError)
+{
+    const int user_error = 10;
+    EXPECT_CALL(mock, sd_event_exit(expected_event, user_error))
+        .WillOnce(Return(user_error));
+    EXPECT_EQ(user_error, event->exit(user_error));
+}
+
+TEST_F(EventMethodTest, ExitInternalError)
+{
+    EXPECT_CALL(mock, sd_event_exit(expected_event, 5))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->exit(5), SdEventError);
+}
+
+TEST_F(EventMethodTest, GetExitCodeSuccess)
+{
+    EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
+        .WillOnce(DoAll(SetArgPointee<1>(1), Return(0)));
+    EXPECT_EQ(1, event->get_exit_code());
+
+    EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
+        .WillOnce(DoAll(SetArgPointee<1>(0), Return(2)));
+    EXPECT_EQ(0, event->get_exit_code());
+}
+
+TEST_F(EventMethodTest, GetExitCodeError)
+{
+    EXPECT_CALL(mock, sd_event_get_exit_code(expected_event, testing::_))
+        .WillOnce(Return(-EINVAL));
+    EXPECT_THROW(event->get_exit_code(), SdEventError);
+}
+
 TEST_F(EventMethodTest, GetWatchdogSuccess)
 {
     EXPECT_CALL(mock, sd_event_get_watchdog(expected_event))
