diff --git a/services/media/factory_service/BUILD.gn b/services/media/factory_service/BUILD.gn
index c93cee3..21a1e4b 100644
--- a/services/media/factory_service/BUILD.gn
+++ b/services/media/factory_service/BUILD.gn
@@ -49,6 +49,7 @@
     "//services/media/framework_create",
     "//services/media/framework_ffmpeg",
     "//services/media/framework_mojo",
+    "//services/util/cpp",
     "//url",
   ]
 }
diff --git a/services/media/factory_service/factory_service.cc b/services/media/factory_service/factory_service.cc
index 6fe73f1..94b4c9b 100644
--- a/services/media/factory_service/factory_service.cc
+++ b/services/media/factory_service/factory_service.cc
@@ -13,21 +13,10 @@
 namespace mojo {
 namespace media {
 
-MediaFactoryService::ProductBase::ProductBase(MediaFactoryService* owner)
-    : owner_(owner) {
-  DCHECK(owner_);
-}
-
-MediaFactoryService::ProductBase::~ProductBase() {}
-
 MediaFactoryService::MediaFactoryService() {}
 
 MediaFactoryService::~MediaFactoryService() {}
 
-void MediaFactoryService::Initialize(ApplicationImpl* app) {
-  app_ = app;
-}
-
 bool MediaFactoryService::ConfigureIncomingConnection(
     ServiceProviderImpl* service_provider_impl) {
   service_provider_impl->AddService<MediaFactory>(
@@ -40,43 +29,39 @@
 
 void MediaFactoryService::CreatePlayer(InterfaceHandle<SeekingReader> reader,
                                        InterfaceRequest<MediaPlayer> player) {
-  products_.insert(std::static_pointer_cast<ProductBase>(
-      MediaPlayerImpl::Create(reader.Pass(), player.Pass(), this)));
+  AddProduct(MediaPlayerImpl::Create(reader.Pass(), player.Pass(), this));
 }
 
 void MediaFactoryService::CreateSource(InterfaceHandle<SeekingReader> reader,
                                        Array<MediaTypeSetPtr> media_types,
                                        InterfaceRequest<MediaSource> source) {
-  products_.insert(
-      std::static_pointer_cast<ProductBase>(MediaSourceImpl::Create(
-          reader.Pass(), media_types, source.Pass(), this)));
+  AddProduct(
+      MediaSourceImpl::Create(reader.Pass(), media_types, source.Pass(), this));
 }
 
 void MediaFactoryService::CreateSink(const String& destination_url,
                                      MediaTypePtr media_type,
                                      InterfaceRequest<MediaSink> sink) {
-  products_.insert(std::static_pointer_cast<ProductBase>(MediaSinkImpl::Create(
-      destination_url, media_type.Pass(), sink.Pass(), this)));
+  AddProduct(MediaSinkImpl::Create(destination_url, media_type.Pass(),
+                                   sink.Pass(), this));
 }
 
 void MediaFactoryService::CreateDemux(InterfaceHandle<SeekingReader> reader,
                                       InterfaceRequest<MediaDemux> demux) {
-  products_.insert(std::static_pointer_cast<ProductBase>(
-      MediaDemuxImpl::Create(reader.Pass(), demux.Pass(), this)));
+  AddProduct(MediaDemuxImpl::Create(reader.Pass(), demux.Pass(), this));
 }
 
 void MediaFactoryService::CreateDecoder(
     MediaTypePtr input_media_type,
     InterfaceRequest<MediaTypeConverter> decoder) {
-  products_.insert(std::static_pointer_cast<ProductBase>(
-      MediaDecoderImpl::Create(input_media_type.Pass(), decoder.Pass(), this)));
+  AddProduct(
+      MediaDecoderImpl::Create(input_media_type.Pass(), decoder.Pass(), this));
 }
 
 void MediaFactoryService::CreateNetworkReader(
     const String& url,
     InterfaceRequest<SeekingReader> reader) {
-  products_.insert(std::static_pointer_cast<ProductBase>(
-      NetworkReaderImpl::Create(url, reader.Pass(), this)));
+  AddProduct(NetworkReaderImpl::Create(url, reader.Pass(), this));
 }
 
 }  // namespace media
diff --git a/services/media/factory_service/factory_service.h b/services/media/factory_service/factory_service.h
index f2a7fd5..8b4f520 100644
--- a/services/media/factory_service/factory_service.h
+++ b/services/media/factory_service/factory_service.h
@@ -5,77 +5,23 @@
 #ifndef MOJO_SERVICES_MEDIA_FACTORY_FACTORY_SERVICE_H_
 #define MOJO_SERVICES_MEDIA_FACTORY_FACTORY_SERVICE_H_
 
-#include <unordered_set>
-
 #include "mojo/common/binding_set.h"
 #include "mojo/public/cpp/application/application_delegate.h"
 #include "mojo/public/cpp/application/application_impl.h"
 #include "mojo/services/media/control/interfaces/media_factory.mojom.h"
+#include "services/util/cpp/factory_service_base.h"
 
 namespace mojo {
 namespace media {
 
-class MediaFactoryService : public ApplicationDelegate,
+class MediaFactoryService : public util::FactoryServiceBase,
                             public MediaFactory {
  public:
-  // Provides common behavior for all objects created by the factory service.
-  class ProductBase : public std::enable_shared_from_this<ProductBase> {
-   public:
-    virtual ~ProductBase();
-
-   protected:
-    ProductBase(MediaFactoryService* owner);
-
-    // Returns the ApplicationImpl.
-    ApplicationImpl* app() {
-      DCHECK(owner_->app_);
-      return owner_->app_;
-    }
-
-    // Tells the factory service to release this product.
-    void ReleaseFromOwner() {
-      size_t erased = owner_->products_.erase(shared_from_this());
-      DCHECK(erased);
-    }
-
-   private:
-    MediaFactoryService* owner_;
-  };
-
-  template <typename Interface>
-  class Product : public ProductBase {
-   public:
-    virtual ~Product() {}
-
-   protected:
-    Product(Interface* impl,
-            InterfaceRequest<Interface> request,
-            MediaFactoryService* owner)
-        : ProductBase(owner), binding_(impl, request.Pass()) {
-      DCHECK(impl);
-      binding_.set_connection_error_handler([this]() { ReleaseFromOwner(); });
-    }
-
-    // Closes the binding and calls ReleaseFromOwner.
-    void UnbindAndReleaseFromOwner() {
-      if (binding_.is_bound()) {
-        binding_.Close();
-      }
-
-      ReleaseFromOwner();
-    }
-
-   private:
-    Binding<Interface> binding_;
-  };
-
   MediaFactoryService();
 
   ~MediaFactoryService() override;
 
   // ApplicationDelegate implementation.
-  void Initialize(ApplicationImpl* app) override;
-
   bool ConfigureIncomingConnection(
       ServiceProviderImpl* service_provider_impl) override;
 
@@ -102,21 +48,8 @@
 
  private:
   BindingSet<MediaFactory> bindings_;
-  ApplicationImpl* app_;
-  std::unordered_set<std::shared_ptr<ProductBase>> products_;
 };
 
-// For use by products when handling mojo requests.
-// Checks the condition, and, if it's false, unbinds, releases from the owner
-// and calls return. Doesn't support stream arguments.
-// TODO(dalesat): Support stream arguments.
-#define RCHECK(condition)                                         \
-  if (!(condition)) {                                             \
-    LOG(ERROR) << "request precondition failed: " #condition "."; \
-    UnbindAndReleaseFromOwner();                                  \
-    return;                                                       \
-  }
-
 }  // namespace media
 }  // namespace mojo
 
diff --git a/services/util/cpp/BUILD.gn b/services/util/cpp/BUILD.gn
new file mode 100644
index 0000000..6a917c3
--- /dev/null
+++ b/services/util/cpp/BUILD.gn
@@ -0,0 +1,21 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/module_args/mojo.gni")
+import("//mojo/public/mojo_application.gni")
+import("$mojo_sdk_root/mojo/public/mojo_sdk.gni")
+
+source_set("cpp") {
+  sources = [
+    "factory_service_base.cc",
+    "factory_service_base.h",
+  ]
+
+  deps = [
+    "//base",
+    "//mojo/application",
+    "//mojo/common",
+    "//mojo/public/cpp/application",
+  ]
+}
diff --git a/services/util/cpp/factory_service_base.cc b/services/util/cpp/factory_service_base.cc
new file mode 100644
index 0000000..cc00c1b
--- /dev/null
+++ b/services/util/cpp/factory_service_base.cc
@@ -0,0 +1,27 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/logging.h"
+#include "services/util/cpp/factory_service_base.h"
+
+namespace mojo {
+namespace util {
+
+FactoryServiceBase::ProductBase::ProductBase(FactoryServiceBase* owner)
+    : owner_(owner) {
+  DCHECK(owner_);
+}
+
+FactoryServiceBase::ProductBase::~ProductBase() {}
+
+FactoryServiceBase::FactoryServiceBase() {}
+
+FactoryServiceBase::~FactoryServiceBase() {}
+
+void FactoryServiceBase::Initialize(ApplicationImpl* app) {
+  app_ = app;
+}
+
+}  // namespace util
+}  // namespace mojo
diff --git a/services/util/cpp/factory_service_base.h b/services/util/cpp/factory_service_base.h
new file mode 100644
index 0000000..9a5ec4a
--- /dev/null
+++ b/services/util/cpp/factory_service_base.h
@@ -0,0 +1,103 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_SERVICES_UTIL_CPP_FACTORY_SERVICE_BASE_H_
+#define MOJO_SERVICES_UTIL_CPP_FACTORY_SERVICE_BASE_H_
+
+#include <memory>
+#include <unordered_set>
+
+#include "base/logging.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_impl.h"
+
+namespace mojo {
+namespace util {
+
+class FactoryServiceBase : public ApplicationDelegate {
+ public:
+  // Provides common behavior for all objects created by the factory service.
+  class ProductBase : public std::enable_shared_from_this<ProductBase> {
+   public:
+    virtual ~ProductBase();
+
+   protected:
+    ProductBase(FactoryServiceBase* owner);
+
+    // Returns the ApplicationImpl.
+    ApplicationImpl* app() {
+      DCHECK(owner_->app_);
+      return owner_->app_;
+    }
+
+    // Tells the factory service to release this product.
+    void ReleaseFromOwner() {
+      size_t erased = owner_->products_.erase(shared_from_this());
+      DCHECK(erased);
+    }
+
+   private:
+    FactoryServiceBase* owner_;
+  };
+
+  template <typename Interface>
+  class Product : public ProductBase {
+   public:
+    virtual ~Product() {}
+
+   protected:
+    Product(Interface* impl,
+            InterfaceRequest<Interface> request,
+            FactoryServiceBase* owner)
+        : ProductBase(owner), binding_(impl, request.Pass()) {
+      DCHECK(impl);
+      binding_.set_connection_error_handler([this]() { ReleaseFromOwner(); });
+    }
+
+    // Closes the binding and calls ReleaseFromOwner.
+    void UnbindAndReleaseFromOwner() {
+      if (binding_.is_bound()) {
+        binding_.Close();
+      }
+
+      ReleaseFromOwner();
+    }
+
+   private:
+    Binding<Interface> binding_;
+  };
+
+  FactoryServiceBase();
+
+  ~FactoryServiceBase() override;
+
+  // ApplicationDelegate implementation.
+  void Initialize(ApplicationImpl* app) override;
+
+ protected:
+  template <typename ProductImpl>
+  void AddProduct(std::shared_ptr<ProductImpl> product) {
+    products_.insert(std::static_pointer_cast<ProductBase>(product));
+  }
+
+ private:
+  ApplicationImpl* app_;
+  std::unordered_set<std::shared_ptr<ProductBase>> products_;
+};
+
+// For use by products when handling mojo requests.
+// Checks the condition, and, if it's false, unbinds, releases from the owner
+// and calls return. Doesn't support stream arguments.
+// TODO(dalesat): Support stream arguments.
+#define RCHECK(condition)                                         \
+  if (!(condition)) {                                             \
+    LOG(ERROR) << "request precondition failed: " #condition "."; \
+    UnbindAndReleaseFromOwner();                                  \
+    return;                                                       \
+  }
+
+}  // namespace util
+}  // namespace mojo
+
+#endif  // MOJO_SERVICES_UTIL_CPP_FACTORY_SERVICE_BASE_H_
