Index: src/includes/topics/functions.php
===================================================================
--- src/includes/topics/functions.php	(revision 5424)
+++ src/includes/topics/functions.php	(working copy)
@@ -330,6 +330,15 @@
 
 	if ( !empty( $topic_id ) && !is_wp_error( $topic_id ) ) {
 
+		/** Close Check *******************************************************/
+
+		// If the topic is closed, close it properly
+		if ( ( get_post_field( 'post_status', $topic_id ) === bbp_get_closed_status_id() ) || ( $topic_data['post_status'] === bbp_get_closed_status_id() ) ) {
+
+			// Close the topic
+			bbp_close_topic( $topic_id );
+		}
+
 		/** Trash Check *******************************************************/
 
 		// If the forum is trash, or the topic_status is switched to
@@ -2708,6 +2717,7 @@
  *
  * @param int $topic_id Topic id
  * @uses bbp_get_topic() To get the topic
+ * @uses get_post_meta() To get the topic status meta
  * @uses do_action() Calls 'bbp_close_topic' with the topic id
  * @uses add_post_meta() To add the previous status to a meta
  * @uses wp_update_post() To update the topic with the new status
@@ -2722,16 +2732,22 @@
 		return $topic;
 	}
 
-	// Bail if already closed
-	if ( bbp_get_closed_status_id() === $topic->post_status ) {
+	// Get previous topic status meta
+	$topic_status = get_post_meta( $topic_id, '_bbp_status', true );
+
+	// Bail if already closed and topic status meta exists
+	if ( bbp_get_closed_status_id() === $topic->post_status && ! empty( $topic_status ) ) {
 		return false;
 	}
 
+	// Set status meta public
+	$topic_status = bbp_get_public_status_id();
+
 	// Execute pre close code
 	do_action( 'bbp_close_topic', $topic_id );
 
 	// Add pre close status
-	add_post_meta( $topic_id, '_bbp_status', $topic->post_status );
+	add_post_meta( $topic_id, '_bbp_status', $topic_status );
 
 	// Set closed status
 	$topic->post_status = bbp_get_closed_status_id();
