diff --git a/gst/gstparamspecs.c b/gst/gstparamspecs.c
index e75a944..88dc97a 100644
--- a/gst/gstparamspecs.c
+++ b/gst/gstparamspecs.c
@@ -205,3 +205,49 @@ gst_param_spec_fraction (const gchar * name, const gchar * nick,
 
   return pspec;
 }
+
+/**
+ * gst_param_spec_is_mutable
+ * @param_spec: a GParamSpec representing a property
+ * @element: the GstElement of the property to be modified
+ *
+ * Checks if an object property for the GstElement given in @element
+ * may be modified given the current state of @element.
+ *
+ * Returns: TRUE if the property may be modified
+ */
+gboolean
+gst_param_spec_is_mutable (GParamSpec *param_spec, GstElement *element)
+{
+  gboolean ret = TRUE;
+  GstState state;
+
+  if (param_spec->flags & GST_PARAM_MUTABLE_PLAYING) {
+    return TRUE;
+  }
+
+  GST_OBJECT_LOCK (element);
+  state = GST_STATE (element);
+  if (param_spec->flags & GST_PARAM_MUTABLE_PAUSED) {
+    if (state != GST_STATE_NULL && state != GST_STATE_READY
+        && state != GST_STATE_PAUSED) {
+      GST_WARNING_OBJECT(element, "setting property in wrong state");
+      ret = FALSE;
+    }
+  } else if (param_spec->flags & GST_PARAM_MUTABLE_READY) {
+    if (state != GST_STATE_NULL && state != GST_STATE_READY) {
+      GST_WARNING_OBJECT(element, "setting property in wrong state");
+      ret = FALSE;
+    }
+  } else {
+    if (state != GST_STATE_NULL) {
+      GST_WARNING_OBJECT(element, "setting property in wrong state");
+      ret = FALSE;
+    }
+  }
+  GST_OBJECT_UNLOCK (element);
+
+  return ret;
+}
+
+
diff --git a/gst/gstparamspecs.h b/gst/gstparamspecs.h
index 079ff4d..86d066f 100644
--- a/gst/gstparamspecs.h
+++ b/gst/gstparamspecs.h
@@ -20,6 +20,7 @@
 #ifndef __GST_PARAMSPECS_H__
 #define __GST_PARAMSPECS_H__
 
+#include <gst/gstelement.h>
 #include <gst/gstvalue.h>
 
 G_BEGIN_DECLS
@@ -35,6 +36,32 @@ G_BEGIN_DECLS
 #define	GST_PARAM_CONTROLLABLE	(1 << (G_PARAM_USER_SHIFT + 1))
 
 /**
+ * GST_PARAM_MUTABLE_READY:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the READY or lower state.
+ */
+#define GST_PARAM_MUTABLE_READY  (1 << (G_PARAM_USER_SHIFT + 2))
+
+/**
+ * GST_PARAM_MUTABLE_PAUSED:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the PAUSED or lower state.
+ * This flag implies GST_PARAM_MUTABLE_READY.
+ */
+#define GST_PARAM_MUTABLE_PAUSED  (1 << (G_PARAM_USER_SHIFT + 3))
+
+/**
+ * GST_PARAM_MUTABLE_PLAYING:
+ *
+ * Use this flag on GObject properties of GstElements to indicate that
+ * they can be changed when the element is in the PLAYING or lower state.
+ * This flag implies GST_PARAM_MUTABLE_PAUSED.
+ */
+#define GST_PARAM_MUTABLE_PLAYING  (1 << (G_PARAM_USER_SHIFT + 4))
+
+/**
  * GST_PARAM_USER_SHIFT:
  *
  * Bits based on GST_PARAM_USER_SHIFT can be used by 3rd party applications.
@@ -90,6 +117,9 @@ GParamSpec  * gst_param_spec_fraction (const gchar * name,
                                        gint default_num, gint default_denom,
                                        GParamFlags flags);
 
+gboolean gst_param_spec_is_mutable (GParamSpec *param_spec,
+    GstElement *element);
+
 G_END_DECLS
 
 #endif /* __GST_PARAMSPECS_H__ */
diff --git a/plugins/elements/gstfilesrc.c b/plugins/elements/gstfilesrc.c
index 3a55a7e..0dcf4d3 100644
--- a/plugins/elements/gstfilesrc.c
+++ b/plugins/elements/gstfilesrc.c
@@ -248,7 +248,7 @@ gst_file_src_class_init (GstFileSrcClass * klass)
   g_object_class_install_property (gobject_class, ARG_LOCATION,
       g_param_spec_string ("location", "File Location",
           "Location of the file to read", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_MUTABLE_READY));
   g_object_class_install_property (gobject_class, ARG_MMAPSIZE,
       g_param_spec_ulong ("mmapsize", "mmap() Block Size",
           "Size in bytes of mmap()d regions", 0, G_MAXULONG, DEFAULT_MMAPSIZE,
@@ -383,6 +383,11 @@ gst_file_src_set_property (GObject * object, guint prop_id,
 
   src = GST_FILE_SRC (object);
 
+  if (!gst_param_spec_is_mutable (pspec, GST_ELEMENT (src))) {
+    GST_ERROR_OBJECT (src, "ack, ack, ack!");
+    return;
+  }
+
   switch (prop_id) {
     case ARG_LOCATION:
       gst_file_src_set_location (src, g_value_get_string (value));
