diff --git a/src/workflows/proto/main_pb.js b/src/workflows/proto/main_pb.js
index 7fa4d98..d44f49d 100644
--- a/src/workflows/proto/main_pb.js
+++ b/src/workflows/proto/main_pb.js
@@ -22,6 +22,7 @@
 goog.exportSymbol('workflows.Action.MarkDuplicateAction', null, proto);
 goog.exportSymbol('workflows.Action.MoveAction', null, proto);
 goog.exportSymbol('workflows.Action.ReplyAction', null, proto);
+goog.exportSymbol('workflows.Action.ReplyWithCRAction', null, proto);
 goog.exportSymbol('workflows.Action.ReportAction', null, proto);
 goog.exportSymbol('workflows.Action.ReportAction.ReportType', null, proto);
 goog.exportSymbol('workflows.Action.StarAction', null, proto);
@@ -167,6 +168,27 @@
  * @extends {jspb.Message}
  * @constructor
  */
+proto.workflows.Action.ReplyWithCRAction = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.workflows.Action.ReplyWithCRAction, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.workflows.Action.ReplyWithCRAction.displayName = 'proto.workflows.Action.ReplyWithCRAction';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
 proto.workflows.Action.StarAction = function(opt_data) {
   jspb.Message.initialize(this, opt_data, 0, -1, null, null);
 };
@@ -452,7 +474,7 @@
  * @private {!Array<!Array<number>>}
  * @const
  */
-proto.workflows.Action.oneofGroups_ = [[1,2,3,4,5,16,17,18,19]];
+proto.workflows.Action.oneofGroups_ = [[1,2,3,4,5,6,16,17,18,19]];
 
 /**
  * @enum {number}
@@ -464,6 +486,7 @@
   MARK_DUPLICATE_ACTION: 3,
   UNMARK_DUPLICATE_ACTION: 4,
   ATTRIBUTE_ACTION: 5,
+  REPLY_WITH_CR_ACTION: 6,
   STAR_ACTION: 16,
   SUBSCRIBE_ACTION: 17,
   VOTE_ACTION: 18,
@@ -513,6 +536,7 @@
     markDuplicateAction: (f = msg.getMarkDuplicateAction()) && proto.workflows.Action.MarkDuplicateAction.toObject(includeInstance, f),
     unmarkDuplicateAction: (f = msg.getUnmarkDuplicateAction()) && proto.workflows.Action.UnmarkDuplicateAction.toObject(includeInstance, f),
     attributeAction: (f = msg.getAttributeAction()) && proto.workflows.Action.AttributeAction.toObject(includeInstance, f),
+    replyWithCrAction: (f = msg.getReplyWithCrAction()) && proto.workflows.Action.ReplyWithCRAction.toObject(includeInstance, f),
     starAction: (f = msg.getStarAction()) && proto.workflows.Action.StarAction.toObject(includeInstance, f),
     subscribeAction: (f = msg.getSubscribeAction()) && proto.workflows.Action.SubscribeAction.toObject(includeInstance, f),
     voteAction: (f = msg.getVoteAction()) && proto.workflows.Action.VoteAction.toObject(includeInstance, f),
@@ -578,6 +602,11 @@
       reader.readMessage(value,proto.workflows.Action.AttributeAction.deserializeBinaryFromReader);
       msg.setAttributeAction(value);
       break;
+    case 6:
+      var value = new proto.workflows.Action.ReplyWithCRAction;
+      reader.readMessage(value,proto.workflows.Action.ReplyWithCRAction.deserializeBinaryFromReader);
+      msg.setReplyWithCrAction(value);
+      break;
     case 16:
       var value = new proto.workflows.Action.StarAction;
       reader.readMessage(value,proto.workflows.Action.StarAction.deserializeBinaryFromReader);
@@ -667,6 +696,14 @@
       proto.workflows.Action.AttributeAction.serializeBinaryToWriter
     );
   }
+  f = message.getReplyWithCrAction();
+  if (f != null) {
+    writer.writeMessage(
+      6,
+      f,
+      proto.workflows.Action.ReplyWithCRAction.serializeBinaryToWriter
+    );
+  }
   f = message.getStarAction();
   if (f != null) {
     writer.writeMessage(
@@ -1383,6 +1420,196 @@
  *     http://goto/soy-param-migration
  * @return {!Object}
  */
+proto.workflows.Action.ReplyWithCRAction.prototype.toObject = function(opt_includeInstance) {
+  return proto.workflows.Action.ReplyWithCRAction.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.workflows.Action.ReplyWithCRAction} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.workflows.Action.ReplyWithCRAction.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    cannedResponseId: jspb.Message.getFieldWithDefault(msg, 1, 0),
+    subscribe: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
+    markAsAnswer: jspb.Message.getBooleanFieldWithDefault(msg, 3, false)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.workflows.Action.ReplyWithCRAction}
+ */
+proto.workflows.Action.ReplyWithCRAction.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.workflows.Action.ReplyWithCRAction;
+  return proto.workflows.Action.ReplyWithCRAction.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.workflows.Action.ReplyWithCRAction} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.workflows.Action.ReplyWithCRAction}
+ */
+proto.workflows.Action.ReplyWithCRAction.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {number} */ (reader.readInt64());
+      msg.setCannedResponseId(value);
+      break;
+    case 2:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setSubscribe(value);
+      break;
+    case 3:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setMarkAsAnswer(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.workflows.Action.ReplyWithCRAction.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.workflows.Action.ReplyWithCRAction} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.workflows.Action.ReplyWithCRAction.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getCannedResponseId();
+  if (f !== 0) {
+    writer.writeInt64(
+      1,
+      f
+    );
+  }
+  f = message.getSubscribe();
+  if (f) {
+    writer.writeBool(
+      2,
+      f
+    );
+  }
+  f = message.getMarkAsAnswer();
+  if (f) {
+    writer.writeBool(
+      3,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional int64 canned_response_id = 1;
+ * @return {number}
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.getCannedResponseId = function() {
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.workflows.Action.ReplyWithCRAction} returns this
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.setCannedResponseId = function(value) {
+  return jspb.Message.setProto3IntField(this, 1, value);
+};
+
+
+/**
+ * optional bool subscribe = 2;
+ * @return {boolean}
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.getSubscribe = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.workflows.Action.ReplyWithCRAction} returns this
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.setSubscribe = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 2, value);
+};
+
+
+/**
+ * optional bool mark_as_answer = 3;
+ * @return {boolean}
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.getMarkAsAnswer = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.workflows.Action.ReplyWithCRAction} returns this
+ */
+proto.workflows.Action.ReplyWithCRAction.prototype.setMarkAsAnswer = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 3, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
 proto.workflows.Action.StarAction.prototype.toObject = function(opt_includeInstance) {
   return proto.workflows.Action.StarAction.toObject(opt_includeInstance, this);
 };
@@ -2239,6 +2466,43 @@
 
 
 /**
+ * optional ReplyWithCRAction reply_with_cr_action = 6;
+ * @return {?proto.workflows.Action.ReplyWithCRAction}
+ */
+proto.workflows.Action.prototype.getReplyWithCrAction = function() {
+  return /** @type{?proto.workflows.Action.ReplyWithCRAction} */ (
+    jspb.Message.getWrapperField(this, proto.workflows.Action.ReplyWithCRAction, 6));
+};
+
+
+/**
+ * @param {?proto.workflows.Action.ReplyWithCRAction|undefined} value
+ * @return {!proto.workflows.Action} returns this
+*/
+proto.workflows.Action.prototype.setReplyWithCrAction = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 6, proto.workflows.Action.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.workflows.Action} returns this
+ */
+proto.workflows.Action.prototype.clearReplyWithCrAction = function() {
+  return this.setReplyWithCrAction(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.workflows.Action.prototype.hasReplyWithCrAction = function() {
+  return jspb.Message.getField(this, 6) != null;
+};
+
+
+/**
  * optional StarAction star_action = 16;
  * @return {?proto.workflows.Action.StarAction}
  */
